这是第一道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;
}
浙公网安备 33010602011771号