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;
}