您的位置:首页 > 其它

深度优先搜索(DFS):POJ1979--Red and Black

2016-08-13 23:27 423 查看
本题是很简单的深搜题。从起点出发每个黑色顶点访问一次即可,访问过的标为已访问(或直接标红色)。看到有些人使用了记忆化搜索,是小题大做了,因为本题的顶点访问一次后就“失效”了,所以没有记忆的必要。原题链接

#include <iostream>
#include <cstring>
#define MAX_W 21
#define MAX_H 21
#define INF 10000
using namespace std;

int data[MAX_W][MAX_H];    ///不存在为INF,不可走为0,走过为-1,可走为1(前三个可只用0表示)
int xi[]={1,0,-1,0};    ///定义方向
int yi[]={0,1,0,-1};
int w,h;

int solve(int x,int y){
if(data[x][y]!=1) return 0;
data[x][y]=-1;
int sum=0;
for(int i=0;i<4;i++)
if(x+xi[i]>=0&&x+xi[i]<=h&&y+yi[i]>=0&&y+yi[i]<=w) sum+=solve(x+xi[i],y+yi[i]);
return 1+sum;
}

int main()
{
int xx,yy;
char tmp;
while(cin>>w>>h){
if(!w||!h) break;
memset(data,INF,sizeof(data));    ///矩阵快速赋值
for(int i=0;i<h;i++)
for(int j=0;j<w;j++){
cin>>tmp;
if(tmp=='.') data[i][j]=1;
else if(tmp=='#') data[i][j]=0;
else {
xx=i,yy=j;
data[i][j]=1;
}
}

cout<<solve(xx,yy)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ1979 dfs