题目大意:有一个长方形的房间,铺满了正方形瓷砖。每个瓷砖都是红色或黑色的。一个人站在一块黑色的瓷砖上。从一个瓷砖上,他可以移动到四个相邻(上下左右)的瓷砖中的一个。但是他不能移动到红色的瓷砖,只能在黑色的瓷砖上移动。通过重复上面描述的动作,编写一个程序来计算他能达到的黑瓷砖的数量。
输入:多个数据。第一行给出两个数m,n(0,0代表结束输入);m代表列,n代表行。m,n均不超过20。对每一块瓷砖,填入“@”代表人站的初始位置(黑砖),“.”代表黑色砖,“#”代表红色砖.
输出:输出人能踩过的黑色砖的总数(第一块人站的那个也算)。
输入样例:
6 9
…#.
…#
…
…
…
…
…
#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.
…
11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0
输出样例:
45
59
6
13
代码:
深搜:`
#include<stdio.h>
#include<string.h>
int w,h,ans;
char s[22][22];
int vis[22][22];
void dfs(int x,int y)
{
int nest[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
vis[x][y]=1;
ans++;
for(int i=0;i<4;i++)
{
int dx=x+nest[i][0];
int dy=y+nest[i][1];
if(vis[dx][dy]==0&&s[dx][dy]!='#'&&dx>=0&&dx<h&&dy>=0&&dy<w)
{
dfs(dx,dy);
}
}
}
int main()
{
while(~scanf("%d %d",&w,&h)&&(w||h))
{
memset(vis,0,sizeof(vis));
for(int i=0;i<h;i++)
scanf("%s",&s[i]);
ans=0;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
if(s[i][j]=='@')
{
dfs(i,j);
break;
}
}
printf("%d\n",ans);
}
return 0;
}
我一开始在dfs里定义了x,y,temp,temp用来记录可行走的步数,不知道为什么会一直输出0,我就参照了大佬的代码改了,下面是我第一次写的代码
#include<stdio.h>
#include<string.h>
int w,h,temp;
char s[22][22];
int vis[22][22];
void dfs(int x,int y,int temp)
{
int nest[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int dx=x+nest[i][0];
int dy=y+nest[i][1];
if(vis[dx][dy]==0&&s[dx][dy]!='#'&&dx>=0&&dx<h&&dy>=0&&dy<w)
{
dfs(dx,dy,temp+1);
}
}
}
int main()
{
while(~scanf("%d %d",&w,&h)&&(w||h))
{
memset(vis,0,sizeof(vis));
for(int i=0;i<h;i++)
scanf("%s",&s[i]);
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
if(s[i][j]=='@')
{
dfs(i,j,1);
break;
}
}
printf("%d\n",temp);
}
return 0;
}
下面是广搜:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char s[22][22];
int vis[22][22];
int w,h,t;
struct node
{
int x,y,step;
};
int bfs(int i,int j)
{
int nest[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
node a,b;
queue<node> q;
t=1;
a.x=i;
a.y=j;
q.push(a);
vis[i][j]=1;
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=0;i<4;i++)
{
b.x=a.x+nest[i][0];
b.y=a.y+nest[i][1];
if(vis[b.x][b.y]==0&&s[b.x][b.y]!='#'&&b.x>=0&&b.x<h&&b.y>=0&&b.y<w)
{
t++;
vis[b.x][b.y]=1;
q.push(b);
}
}
}
return t;
}
int main()
{
while(~scanf("%d %d",&w,&h)&&(w||h))
{
memset(vis,0,sizeof(vis));
for(int i=0;i<h;i++)
scanf("%s",&s[i]);
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(s[i][j]=='@')
{
bfs(i,j);
break;
}
}
}
printf("%d\n",t);
}
return 0;
}