6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13
Asia 2004, Ehime (Japan), Japan Domestic
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
题意:根据地图,问可以到达多少地方.'@'为起点, ' . '为路,可以到达, ' # '为墙,不能通过.
思路:简单题,既可以用深搜,也可以用广搜,广搜是可以用C++里的queue,如果是C的话也可以实现其功能,其实也没有多复杂.
注意:输入的两个数,第一个是列数,第二个是行数!!!
还有一个小技巧,搜索过的地方可以用'#'标记!
#include<iostream> #include <cstdio>//getchar()头文件 using namespace std; char a[25][25]; int dir[4][2]= { {1,0}, //向右 {-1,0},//向左 {0,1}, //向上 {0,-1} //向下 }; int x,y,num; bool YES(int x0,int y0)//xx,yy { //x--列,y--行 if(x0<y&&x0>=0&&y0>=0&&y0<x) return true; else return false; } void DFS(int x0,int y0) { a[x0][y0]='#'; num++; int xx,yy; for(int i=0; i<4; i++) { int xx=x0+dir[i][0]; int yy=y0+dir[i][1]; if(YES(xx,yy)&&a[xx][yy]=='.') DFS(xx,yy); } } int main() { int i,j,di,dj; while (scanf("%d%d",&x,&y)!=EOF) { getchar(); if (x==0&&y==0) break; for (i=0; i<y; i++) { for (j=0; j<x; j++) { scanf("%c",&a[i][j]); if(a[i][j] == '@') { di = i; dj = j; } } getchar(); } num=0; DFS(di,dj); cout<<num<<endl; } return 0; }
#include<cstdio> #include<queue> using namespace std; char a[25][25]; int x,y,sum; int dir[4][2]={1,0,0,1,-1,0,0,-1}; struct node { int x,y; }q[500]; bool YES(int x0,int y0)//xx,yy { //x--列,y--行 if(x0<y&&x0>=0&&y0>=0&&y0<x) return true; else return false; } void BFS(int x0,int y0) { queue<node>q; node start,endd; start.x=x0; start.y=y0; q.push(start); while(!q.empty()) { start=q.front(); q.pop(); for(int i=0;i<4;i++) { endd.x=start.x+dir[i][0]; endd.y=start.y+dir[i][1]; if(YES(endd.x,endd.y)&&a[endd.x][endd.y]=='.') { a[endd.x][endd.y]='#'; sum++; q.push(endd); } } } } int main() { int i,j,di,dj; while (scanf("%d%d",&x,&y)!=EOF) { getchar(); if (x==0&&y==0) break; for (i=0; i<y; i++) { for (j=0; j<x; j++) { scanf("%c",&a[i][j]); if(a[i][j] == '@') { di = i; dj = j; } } getchar(); } sum=1; BFS(di,dj); printf("%d\n",sum); } return 0; }
#include<cstdio> #include<queue> using namespace std; int a[25][25]; int x,y,sum; int dir[4][2]={1,0,0,1,-1,0,0,-1}; struct node { int x,y; }q[500]; bool YES(int x0,int y0)//xx,yy { //x--列,y--行 if(x0<y&&x0>=0&&y0>=0&&y0<x) return true; else return false; } void BFS(int x0,int y0) { int head=0,tail=1; q[1].x=x0; q[1].y=y0; while(head<tail) { ++head; for(int i=0;i<4;i++) { int x1=q[head].x+dir[i][0]; int y1=q[head].y+dir[i][1]; if(YES(x1,y1)&&a[x1][y1]=='.') { a[x1][y1]='#'; sum++; q[++tail].x=x1; q[tail].y=y1; } } } } int main() { int i,j,di,dj; while (scanf("%d%d",&x,&y)!=EOF) { getchar(); if (x==0&&y==0) break; for (i=0; i<y; i++) { for (j=0; j<x; j++) { scanf("%c",&a[i][j]); if(a[i][j] == '@') { di = i; dj = j; } } getchar(); } sum=1; BFS(di,dj); printf("%d\n",sum); } return 0; }