蛮简单的深搜题目
再说深搜三要素
1.弹出条件(可以没有)
2.是否探查过该点(勾上)
3.for循环里面的路径变换(满足条件计数再深搜)
4.终止条件return
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int w,h;
bool isvisit[22][22];
bool canreach[22][22];
int count=0;
void path(int& a,int& b,int choose)
{
switch(choose)
{
case 0:b+=1;break;
case 1:a+=1;break;
case 2:b-=1;break;
case 3:a-=1;break;
}
}
void dfs(int x,int y)
{
isvisit[x][y]=true;
for(int i=0;i<4;i++)
{
int xx=x;
int yy=y;
path(xx,yy,i);
if(xx>=0&&xx<h&&yy>=0&&yy<w&&!isvisit[xx][yy]&&canreach[xx][yy])
{
count++;
dfs(xx,yy);
}
}
return;
}
int main()
{
//freopen("H:\\in.txt","r",stdin);
//freopen("H:\\out.txt","w",stdout);
char g[22][22];
int startx,starty;
while(cin>>w>>h)
{
count=0;
memset(isvisit,0,sizeof(isvisit));
memset(canreach,0,sizeof(canreach));
if(w==0&&h==0)
break;
for(int i=0;i<h;i++)
{
cin>>g[i];
for(int j=0;j<w;j++)
{
if(g[i][j]=='.')
{
canreach[i][j]=true;
}
else if(g[i][j]=='#')
canreach[i][j]=false;
else if(g[i][j]=='@')
{
canreach[i][j]=true;
startx=i;
starty=j;
}
}
}
dfs(startx,starty);
cout<<count+1<<endl;
}
//fclose(stdin);
//fclose(stdout);
}