您的位置:首页 > 其它

(DFS)hdoj1010-Tempter of the Bone

2016-11-02 10:35 309 查看
#include<cstdio>
#include<cmath>
#include<stdlib.h>
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}},escape,n,m,t,si,sj,ei,ej;
char a[10][10];
void dfs(int si,int sj,int cnt)
{
if(si<0||si>=n||sj<0||sj>=m)
return ;
if(si==ei&&sj==ej&&cnt==t)
{
escape=1;
return;
}
int temp=t-cnt-abs(ei-si)-abs(ej-sj);
if(temp<0||temp%2)
return ;
for(int i=0;i<4;i++)
{
if(a[si+dir[i][0]][sj+dir[i][1]]!='X')
{
a[si+dir[i][0]][sj+dir[i][1]]='X';
dfs(si+dir[i][0],sj+dir[i][1],cnt+1);
if(escape)
return;
a[si+dir[i][0]][sj+dir[i][1]]='.';
}
}
return;

}
int main()
{
int wall=0;
while(scanf("%d%d%d",&n,&m,&t))
{
wall=0;
escape=0;
if(n==0&&m==0&&t==0)    break;
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='S')
{
si=i;
sj=j;
}
if(a[i][j]=='X')
wall++;
if(a[i][j]=='D')
{
ei=i;
ej=j;
}
}
getchar();
}
if(n*m-wall<=t)
{
printf("NO\n");
continue;
}
a[si][sj]='X';
dfs(si,sj,0);
if(escape)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}


正式开始学习和练习DFS、BFS,先从这DFS道中最入门的题开始。

关键:剪枝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: