题目链接:zoj 2165
分析:
专门搜了一道入门级DFS题来做,因为不需要回溯,而且表示图的二维数的元素本就代表可走或不可走,所以直接把访问过的节点标志为不可走,不需要额外的数组。
其次是掌握一个改变方向的办法,先声明一个方向数组,分别代表上下左右,需要改变方向的时候,直接用点的坐标加数组的元素即可。
还有就是注意细节!千万别再把关系符号写成赋值符号了,例如把“==”写成了“=”,猪!
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int map[21][21];
int sum;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//方向数组
bool legal(int x, int y, int w, int h)
{//检查是否越界
if(x>=h||x<0||y>=w||y<0) return false;
return true;
}
void DFS(int x, int y, int w, int h)
{
int tx,ty;
sum++;
map[x][y]=1;
for(int i=0;i<4;i++)
{
tx=x+dir[i][0];
ty=y+dir[i][1];
if(!map[tx][ty]&&legal(tx,ty,w,h)) DFS(tx,ty,w,h);
}
}
int main()
{
int W,H,x,y;
char c;
while(1)
{
scanf("%d%d",&W,&H);
if((W||H)==0) break;
memset(map,0,sizeof(map));
for(int i=0;i<H;i++)
{
getchar();//读入上一行的回车,可读空格、Tab、回车
for(int j=0;j<W;j++)
{
c=getchar();//返回值为用户输入的ASCⅡ码,出错返回-1
if(c=='#') map[i][j]=1;
else if(c=='@')//是“==”不是“=”啊啊啊啊啊
{
x=i;
y=j;
}
}
}
sum=0;
DFS(x,y,W,H);
printf("%d\n",sum);
}
return 0;
}