STL을 이용한 BFS
#include <cstdio> #include <queue> using namespace std; //맵의 크기 t, 맵 변수 a, 댐 시간 변수 k, 홍수 넘침 여부 변수 flood int t,a[101][101],k,flood[101][101]={0,},x,y; //해당 좌표 정보를 저장하는 구조체 typedef struct{ int x,y,count; }Point; //bfs를 위한 큐 queue<Point> q; //해당 위치의 상대 좌표. 물의 확산 비교를 위해 int relPos[4][2]= {{1,0},{-1,0},{0,1,},{0,-1}}; int bfs(){ int ret=0; // 초기 좌표의 정보 값을 저장한 구조체를 만들고, 큐에 넣는다. Point p = {x,y,0}; flood[y][x] = 1; q.push(p); // bfs 시작 while(!q.empty()){ p = q.front(); q.pop(); for(int i=0; i<4;i++){ int px = p.x + relPos[i][0]; int py = p.y + relPos[i][1]; //보드판의 범위 안에 있고, 방문한 적이 없고, 건물이 아니어야 한다. if(px>0&&py>0 && px<t+1&&py<t+1 && flood[py][px]==0 && a[py][px]==0){ //해당 거리에 홍수가 났음을 체크 flood[py][px] = 1; Point np = {px,py,p.count+1}; //만약 이 위치에서 댐을 막았으면 ret의 카운트를 증가. if(p.count+1==k) ret++; q.push(np); } } } return ret; } int main(){ scanf("%d",&t); // 맵 초기화 for(int i =1; i<=t;i++){ for(int j=1;j<=t;j++){ scanf("%d",&a[i][j]); } } scanf("%d %d",&x,&y); scanf("%d",&k); int ret = bfs(); printf(ret==0?"OH, MY GOD":"%d",ret); }
배열을 이용해 큐를 구현해 푼 BFS
#include <cstdio> //맵의 크기 t, 맵변수 a, 댐 시간 변수 k, 홍수 넘침여부 변수 flood int t,a[101][101],k,flood[101][101]={0,},x,y; //해당 좌표 정보를 저장하는 구조체 typedef struct{ int x,y,count; }Point; //bfs를 위한 큐 Point q[10000]; int front=0,rear=0; void enqueue(Point p){ q[rear++] = p; } Point dequeue(){ return q[front++]; } bool isEmpty(){ return front==rear; } //해당 위치의 상대좌표. 물의 확산 비교를 위해 int relPos[4][2]= {{1,0},{-1,0},{0,1,},{0,-1}}; int bfs(){ int ret=0; // 초기 좌표의 정보값을 저장한 구조체를 만들고, 큐에 넣는다. Point p = {x,y,0}; flood[y][x] = 1; enqueue(p); // bfs 시작 while(!isEmpty()){ p = dequeue(); for(int i=0; i<4;i++){ int px = p.x + relPos[i][0]; int py = p.y + relPos[i][1]; //보드판의 범위안에 있고, 방문한적이 없고, 건물이 아니어야한다. if(px>0&&py>0 && px<t+1&&py<t+1 && flood[py][px]==0 && a[py][px]==0){ //해당 거리에 홍수가 났음을 체크 flood[py][px] = 1; Point np = {px,py,p.count+1}; //만약 이 위치에서 댐을 막았으면 ret의 카운트를 증가. if(p.count+1==k) ret++; enqueue(np); } } } return ret; } int main(){ scanf("%d",&t); // 맵 초기화 for(int i =1; i<=t;i++){ for(int j=1;j<=t;j++){ scanf("%d",&a[i][j]); } } scanf("%d %d",&x,&y); scanf("%d",&k); int ret = bfs(); printf(ret==0?"OH, MY GOD":"%d",ret); }
'Algorithm > Problems' 카테고리의 다른 글
백준 - 1697 숨바꼭질 (1) | 2016.02.28 |
---|---|
백준 - 1005 ACM Craft (0) | 2016.02.27 |
알고스팟 - NQUEEN, 백준 - 9663 N-QUEEN (1) | 2016.02.25 |
알고스팟 - MORSE, DICT (0) | 2016.02.25 |
백준 - 1963 소수경로 (0) | 2016.02.24 |