这道题是搜索的水题,拿来做入门的题挺好的。
题目:要求从‘@’点开始,走遍‘.’,不能越过‘#’点,要求输出走‘.’的数目。
自己在做题的时候有两个代码,第一种是递归的思想,第二种是递推的思想,两种都可,但感觉后者要快那么一点点。
如图,第二种快15ms,OvO~。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=25;
int n,m;int x1,y1;int step;
char map[maxn][maxn];
int x[4]={1,0,0,-1},y[4]={0,-1,1,0};
int bfs(int a,int b)
{
if(a<0||a>=n||b<0||b>=m)
return 0;
if(map[a][b]=='#')
return 0;
if(map[a][b]!='#')
{
map[a][b]='#';
return 1+bfs(a+1,b)+bfs(a,b+1)+bfs(a-1,b)+bfs(a,b-1);
}
}
int main()
{
while(~scanf("%d%d",&m,&n),m&&n)
{
step=0;
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
x1=i;
y1=j;
}
}
}
step=bfs(x1,y1);
printf("%d\n",step);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=25;
int n,m;int x1,y1;int step;
char map[maxn][maxn];
int x[4]={1,0,0,-1},y[4]={0,-1,1,0};
void bfs(int a,int b)
{
if(a<0||a>=n||b<0||b>=m)
return ;
if(map[a][b]=='#')
return ;
if(map[a][b]!='#')
{
map[a][b]='#';
step++;
for(int i=0;i<4;i++)
{
bfs(a+x[i],b+y[i]);
}
}
}
int main()
{
while(~scanf("%d%d",&m,&n),m&&n)
{
step=0;
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
x1=i;
y1=j;
}
}
}
bfs(x1,y1);
printf("%d\n",step);
}
return 0;
}