Zerojudge c292

Zerojudge c292

題敘

https://zerojudge.tw/ShowProblem?problemid=c292
給一個二維正方形陣列,邊長為奇數,求從中心點開始向指定方向開始走(上/下/左/右),繞圈走過的元素依照走訪順序輸出

想法

模擬一遍即可
我的作法是記錄現在走訪到哪裡,接下來要往哪個方向走多少距離
將走過點的值儲存到一個陣列中
需要留意在最後一次走訪時前進距離會少1

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//By Koios1143
#include<bits/stdc++.h>
#define LL long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
using namespace std;
int n,st,arr[50][50];
int row=1,col=1;
int last=0;
string ans;
void solve(int x,int y,int face){
if(col+row == 2*n+1)
return;
if(st%2==0 && col+row==2*n)
last=1;
else if(st%2==1 && col+row==2*n)
last=1;
if(face==0){
//left
for(int i=1 ; i<=col-last ; i++){
ans+=(char)('0'+arr[x][y-i]);
}
col++;
solve(x,y-(col-1),1);
}
else if(face==1){
//up
for(int i=1 ; i<=row-last ; i++){
ans+=(char)('0'+arr[x-i][y]);
}
row++;
solve(x-(row-1),y,2);
}
else if(face==2){
//right
for(int i=1 ; i<=col-last ; i++){
ans+=(char)('0'+arr[x][y+i]);
}
col++;
solve(x,y+(col-1),3);
}
else if(face==3){
//down
for(int i=1 ; i<=row-last ; i++){
ans+=(char)('0'+arr[x+i][y]);
}
row++;
solve(x+(row-1),y,0);
}
}
int main(){
IOS
cin>>n>>st;
for(int i=0 ; i<n ; i++)
for(int j=0 ; j<n ; j++)
cin>>arr[i][j];
ans+=(char)('0'+arr[n/2][n/2]);
solve(n/2,n/2,st);
cout<<ans<<'\n';
return 0;
}

複雜度

每個點走訪一遍,每個點走訪時間複雜度為 $O(1)$
總複雜度 $O(n^2)$