一道简单的搜索题,和poj2386差不多,DFS和BFS都可以,当然并查集也可以……
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 14518 | Accepted: 7537 |
Description
Input
Output
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
BFS;
#include<iostream> #include<cstring> using namespace std; struct Node { int x; int y; }queue[7000]; char map[21][21]; int visited[21][21]; int w, h; int ax[4]={-1, 1, 0, 0}; int ay[4]={0, 0, -1, 1}; int BFS(int x, int y) { int num=1;//初始位置为黑色,所以初始值为1 int front=0, rear=1; int i; int X,Y; visited[y][x]=1;//标记 queue[front].x=x; queue[front].y=y; while( front != rear) { for(i=0; i<4; i++) { X=queue[front].x+ax[i]; Y=queue[front].y+ay[i]; if( !visited[Y][X] && (X>=0&&X<w) && (Y>=0&&Y<h))//未越界且未访问过,入队列 { queue[rear].x=X; queue[rear].y=Y; visited[Y][X]=1; rear++; num++; } } front++; } return num; } int main() { int i, j; int x, y; while( cin>>w>>h && w) { memset(visited, 0, sizeof(visited)); for(i=0; i<h; i++) for(j=0; j<w; j++) { cin>>map[i][j]; if( map[i][j]=='#') visited[i][j]=1; else if( map[i][j]=='@')//记录人的初始位置 { x=j;y=i; } } cout<<BFS(x, y)<<endl; } }
#include<iostream> #include<cstring> using namespace std; char map[21][21]; int visited[21][21]; int w, h; int num;//初始位置为黑色,所以初始值为1 int ax[4]={-1, 1, 0, 0}; int ay[4]={0, 0, -1, 1}; void DFS(int x, int y) { int i; if( visited[y][x] == 1 || (x<0||x>=w) || (y<0||y>=h)) //访问过,或越界,递归结束 return ; else//未访问过,继续 { visited[y][x]=1;//标记 num++; for(i=0; i<4; i++) { DFS(x+ax[i], y+ay[i]); } } } int main() { int i, j; int x, y; while( cin>>w>>h && w) { num=0;//初始化初始值 memset(visited, 0, sizeof(visited)); for(i=0; i<h; i++) for(j=0; j<w; j++) { cin>>map[i][j]; if( map[i][j]=='#') visited[i][j]=1; else if( map[i][j]=='@')//记录人的初始位置 { x=j;y=i; } } DFS(x, y); cout<<num<<endl; } }