这是第一道dfs的题。但是网上找到一个用bfs的方法做的题。

那先说说自己用dfs做时卡在空格、回车的输入上,以及在边界问题的处理上。

1、边界问题:自己只考虑了左边和上边要加'.',却忽略了右边和下边也要加。

另外用scanf和%c的格式输入,导致空格问题很难处理。

朋友是用cin》方式输入的,这个不会把空格和回车输入,很实用。

2、忽略了题目中的w是大写的,但编程过程中自己写成了小写。

那先是自己的代码:

#include<iostream>
using namespace std;
bool vis[102][102];
char mat[110][110];
void dfs(int x,int y)
{
 if(mat[x][y]=='.'||vis[x][y]==1) return;
 vis[x][y]=1;
 dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);
 dfs(x,y-1);            dfs(x,y+1);
   dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);
 }
 int main()
 {
  int i,j,n,m,count=0;
    cin>>n>>m;
    for(i=0;i<=n+1;i++)
    {
     mat[i][0]='.';
     mat[i][m+1]='.';
    }
    for(j=0;j<=m+1;j++)
    {
     mat[0][j]='.';
     mat[n+1][j]='.';
    }
     for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
      cin>>mat[i][j]; 
  for(i=1;i<=n;i++)
 for(j=1;j<=m;j++)
 if(vis[i][j]==0&&mat[i][j]=='W')
  {
   count++;
   dfs(i,j);
  } 
printf("%d",count);
 return 0;
}

接下来是用bfs方法做的:

#include<stdio.h>
#include<string.h>
#include<queue>
using
namespace std;
int dir[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,-1,1,-1,-1,1};
char
map[200][200];
int N,M;
int prex,prey;
struct node
{
int
x,y;
};
void BFS()
{
int
i;
queue<node>Q;
node
cur,next;
cur.x=prex;cur.y=prey;
Q.push(cur);
map[cur.x][cur.y]='.';
while(!Q.empty())
{
cur=Q.front();
Q.pop();
for(i=0;i<8;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>=0&&next.y>=0&&next.x<M&&next.y<N&&map[next.x][next.y]=='W')
{
map[next.x][next.y]='.';
Q.push(next);
}
}
}
return;
}
int
main()
{
int
i,j,num=0;
scanf("%d%d",&M,&N);
getchar();
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
scanf("%c",&map[i][j]);
getchar();
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(map[i][j]=='W')
{num++;prex=i;prey=j;BFS();}
}
printf("%d\n",num);
return
0;
}

posted on 2012-07-24 21:06  zhtzhl  阅读(129)  评论(0)    收藏  举报