题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13
思路:简单的搜索题,从‘@’出发,只能站在‘.’上,不能站在‘#’上,求能踩到的.的个数(包括起始点@)
我用BFS做
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int map[22][22]; char a[22][22]; int n,m,fx,fy,kind; queue<int> q; void Init() { int i; for(i=0;i<=n;i++) {a[i][0]='#';a[i][m+1]='#';} for(i=0;i<=m;i++) {a[0][i]='#';a[n+1][i]='#';} memset(map,0,sizeof(map)); } void bfs(int x,int y) { map[x][y]=++kind; q.push(x),q.push(y); while(!q.empty()) { x=q.front();q.pop(); y=q.front();q.pop(); if(a[x-1][y]=='.'&&!map[x-1][y]) { map[x-1][y]=++kind; q.push(x-1),q.push(y); } if(a[x+1][y]=='.'&&!map[x+1][y]) { map[x+1][y]=++kind; q.push(x+1),q.push(y); } if(a[x][y-1]=='.'&&!map[x][y-1]) { map[x][y-1]=++kind; q.push(x),q.push(y-1); } if(a[x][y+1]=='.'&&!map[x][y+1]) { map[x][y+1]=++kind; q.push(x),q.push(y+1); } } } int main() { int i,j; while(scanf("%d%d",&m,&n)!=EOF&&(n+m)) { Init(); for(i=1;i<=n;i++) { getchar(); for(j=1;j<=m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { fx=i;fy=j; } } } kind=0; bfs(fx,fy); printf("%d\n",kind); } return 0; }