Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17917 | Accepted: 9069 |
Description
Input
Output
Sample Input
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
这道题目比较基础,可以深搜也可以广搜
深搜快一点 36ms,广搜47ms。很好的练习题目。
把注释的去掉就是深搜了。
#include <stdio.h> #include <queue> using namespace std; #define N 102 char map[N][N]; int n,m; struct Node { int x,y; }; int dis[10][3]={ {0,1},{0,-1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1} }; void search(int a,int b) { /*map[a][b]='.'; for(int i=0;i<8;i++) { int tmpx=a+dis[i][0]; int tmpy=b+dis[i][1]; if(tmpx>0 && tmpx<=n && tmpy>0 && tmpy<=m && map[tmpx][tmpy]=='W' ){ //map[tmpx][tmpy]='.'; search(tmpx,tmpy); } }*/ Node tmp,be; be.x=a,be.y=b; queue<Node> v; v.push(be); map[a][b]='.'; while(!v.empty()) { be=v.front(); v.pop(); for(int i=0;i<8;i++) { tmp.x=be.x+dis[i][0]; tmp.y=be.y+dis[i][1]; if(tmp.x>0 && tmp.x<=n && tmp.y>0 && tmp.y<=m && map[tmp.x][tmp.y]=='W' ) { v.push(tmp); map[tmp.x][tmp.y]='.'; } } } } int main() { int i,j,count; while(~scanf("%d %d",&n,&m)) { getchar(); count=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%c",&map[i][j]);} ///缺了括号,害死人啊 getchar();} for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(map[i][j]=='W') { //printf("%d %d\n",i,j); search(i,j);count++; } printf("%d\n",count); } return 0; }
深搜递归写法
#include <stdio.h> #include <queue> using namespace std; #define N 102 char map[N][N]; int n,m; void search(int i,int j) { if(map[i][j-1]=='W') { map[i][j-1]='.'; search(i,j-1); } if(map[i][j+1]=='W') { map[i][j+1]='.'; search(i,j+1); } if(map[i-1][j]=='W') { map[i-1][j]='.'; search(i-1,j); } if(map[i+1][j]=='W') { map[i+1][j]='.'; search(i+1,j); } if(map[i-1][j-1]=='W') { map[i-1][j-1]='.'; search(i-1,j-1); } if(map[i-1][j+1]=='W') { map[i-1][j+1]='.'; search(i-1,j+1); } if(map[i+1][j-1]=='W') { map[i+1][j-1]='.'; search(i+1,j-1); } if(map[i+1][j+1]=='W') { map[i+1][j+1]='.'; search(i+1,j+1); } } int main() { int i,j,count; while(~scanf("%d %d",&n,&m)) { getchar(); count=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%c",&map[i][j]);} ///缺了括号,害死人啊 getchar();} for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(map[i][j]=='W') { //printf("%d %d\n",i,j); search(i,j);count++; } printf("%d\n",count); } return 0; }