Description
Input
Output
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
题意:从起点出发,能踩到的格子数。
dfs代码如下:
#include <iostream> #include <cstring> using namespace std; char a[30][30]; int flag[30][30],sum; void dfs(int i,int j) { if(a[i-1][j]=='.'&&flag[i-1][j]==0) { sum++; a[i-1][j]='#'; flag[i-1][j]=1; dfs(i-1,j); } if(a[i][j-1]=='.'&&flag[i][j-1]==0) { sum++; a[i][j-1]='#'; flag[i][j-1]=1; dfs(i,j-1); } if(a[i][j+1]=='.'&&flag[i][j+1]==0) { sum++; a[i][j+1]='#'; flag[i][j+1]=1; dfs(i,j+1); } if(a[i+1][j]=='.'&&flag[i+1][j]==0) { sum++; a[i+1][j]='#'; flag[i+1][j]=1; dfs(i+1,j); } } int main() { int w,h,i,j; while(cin>>w>>h,w+h) { memset(flag,0,sizeof(flag)); memset(a,'#',sizeof(a)); for(i=1;i<=h;i++) { for(j=1;j<=w;j++) { cin>>a[i][j]; } } // for(i=0;i<w;i++) // { // for(j=0;j<h;j++) // { // cout<<a[i][j]; // } // } sum=0; int x,y; for(i=1;i<=h;i++) { for(j=1;j<=w;j++) { if(a[i][j]=='@') { sum++; flag[i][j]=1; dfs(i,j); i=h;j=w; } } } cout<<sum<<endl; } return 0; }
#include<stdio.h> #include<iostream> #include<queue> using namespace std; typedef struct { int x,y; }node; int n,m,a,b; char c[25][25]; void sert() { int i,f[4][2]={0,1,0,-1,1,0,-1,0},p=0;; queue<node> q; node t,temp; t.x=a; t.y=b; q.push(t); while(!q.empty()) { t=q.front(); q.pop(); for(i=0;i<4;i++) { temp.x=t.x+f[i][0]; temp.y=t.y+f[i][1]; if(temp.x>=0&&temp.x<m&&temp.y<n&&temp.y>=0&&c[temp.x][temp.y]!='#') { p++; q.push(temp); c[temp.x][temp.y]='#'; } } } printf("%d\n",p); } int main() { int i,j; while(scanf("%d%d",&n,&m),n||m) { for(i=0;i<m;i++) { getchar(); for(j=0;j<n;j++) { scanf("%c",&c[i][j]); if(c[i][j]=='@') { a=i; b=j; } } } sert(); } return 0; } //bfs 转载http://www.cnblogs.com/xiaofanke/archive/2012/08/22/2651350.html博客已搬: 洪学林博客