HDU 1312Red and Black(简单搜索 bfs或dfs)
发布时间: 2013-10-19 20:58:22 作者: rapoo
HDU 1312Red and Black(简单搜索 bfs或dfs)
6 9....#......#..............................#@...#.#..#.11 9.#..........#.#######..#.#.....#..#.#.###.#..#.#..@#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###...@...###.###..#.#....#.#..0 0
4559613
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<queue>using namespace std;int r,c;int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};char s[25][25];int visi[25][25];void bfs(int t){ queue<int> mq; mq.push(t); while(!mq.empty()) { int p=mq.front(); mq.pop(); int ta=p/c,tb=p%c; for(int i=0;i<4;i++) { int tta=dir[i][0]+ta,ttb=dir[i][1]+tb; if(tta>=0&&tta<r&&ttb>=0&&ttb<c) { if(!visi[tta][ttb]&&s[tta][ttb]=='.') { visi[tta][ttb]=1; mq.push(tta*c+ttb); } } } }}int main(){ int i,j; while(scanf("%d%d",&c,&r)) { if(!r&&!c) break; memset(visi,0,sizeof(visi)); for(i=0;i<r;i++) scanf("%s",s[i]); int a,b; //把起点的位置找到 for(i=0;i<r;i++) for(j=0;j<c;j++) if(s[i][j]=='@') { a=i,b=j; break; } visi[a][b]=1; bfs(a*c+b); int res=0; //统计访问的个数 for(i=0;i<r;i++) for(j=0;j<c;j++) if(visi[i][j]==1) res++; printf("%d\n",res); } return 0;}//15MS