Algorithm/Cases-Study
SWEA-1954 달팽이 숫자
Xi_kor
2021. 3. 18. 20:26
BFS로 해결했다.. 사실 그럴 필요는 없었을 것 같은데 풀 당시에 떠오르는 생각이 그것밖에 없었다.
네 방향을 지정해준뒤 진행을 하다가 범위를 벗어나거나, 이미 달팽이가 방문한 칸을 만난다면 방향을 전환해주었다.
방향을 전환한 뒤에 만난 점을 아직 달팽이가 만나지 않았다면 체크배열에 검사해주고 큐에 push 해주었다.
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int ch[11][11];
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};
int main(){
int test_case;
cin>>test_case;
for(int T=1; T<=test_case; T++){
int n;
cin>>n;
memset(ch, 0, sizeof(ch));
int dir=0;
queue <pair<int, int> >q;
q.push(make_pair(0, 0));
ch[0][0]=1;
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
int nx=x+dx[dir];
int ny=y+dy[dir];
if(nx<0||ny<0||nx>=n||ny>=n||ch[nx][ny]>0){
dir=(dir+1)%4;
nx=x+dx[dir];
ny=y+dy[dir];
}
if(ch[nx][ny]==0){
ch[nx][ny]=ch[x][y]+1;
q.push(make_pair(nx, ny));
}
}
cout<<"#"<<T<<'\n';
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<ch[i][j]<<" ";
}
cout<<'\n';
}
}
return 0;
}