Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 27797 | Accepted: 15093 |
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<cstdio> #include<iomanip> #include<queue> using namespace std; struct note//用结构体模拟一个队列 { int x; int y; }; int main() { int n,m; while(cin>>n>>m,m||n) { struct note que[401];//定义一个队列,大小为长和宽的最大值的乘积,这里是20*20; int tail,head;//初始化我的队列 char a[21][21]; int book[21][21]={0};//定义的book来标记走过的red int i,j,k,sum,startx,starty,tx,ty; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//这是定义方向 for(i=1;i<=m;i++)//存进地图 { for(j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]=='@')//标记初始位置 { startx=i; starty=j; } } } head=1;//初始化队列 tail=1; que[tail].x=startx;//把首地址入队 que[tail].y=starty; tail++; book[startx][starty]=1; sum=1;//可以到达的总地点加1 while(head<tail) { for(k=0;k<=3;k++)//分别朝4个方向走 { tx=que[head].x+next[k][0];//用临时变量储存下一个点 ty=que[head].y+next[k][1];// if(tx<1||tx>m||ty<1||ty>n)//判断是否越界 continue; if(a[tx][ty]=='.'&&book[tx][ty]==0)\\这个点不是#且没有走过 { sum++;//让总的可走的点数加1 book[tx][ty]=1;//标记它为走过的点 que[tail].x=tx;//让这点入队 que[tail].y=ty; tail++; } } head++;//已经被延伸过的点出队 } cout<<sum<<endl; } return 0; }