这个题目我做的时候不是超时就是错误,自己是新手也一直不知道再怎么剪下去 就参考了网上一大牛blog
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//hdu1010 深搜优化剪枝
int m,n,t;
char map[8][8];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int ex,ey,sx,sy,ok;
void dfs(int x,int y,int count)
{
int i;
if(count==t)
{
if(ex==x&&ey==y) ok=1;
return;
}
if(ok) return;//只要找到一条路径 那么就行了
int temp=abs(x-ex)+abs(y-ey)-abs(count-t);//剪枝的地方 判断为奇数或者偶数
if(temp>0||temp&1) return;//如过是奇数 或者当要走的路大于应该走的步数的时候,return;
for(int i=0;i<4;i++)
{
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(fx>=0&&fx<n&&fy>=0&&fy<m&&map[fx][fy]!='X')
{
map[fx][fy]='X';
dfs(fx,fy,count+1);
map[fx][fy]='.';//回溯 对于新手来说可以想一想程序运行框架
}
}
}
int main()
{
int i,j,wall;
while(scanf("%d%d%d",&n,&m,&t)!=EOF&&(n||m||t))
{
wall=0;
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);//最好用scanf gets容易出问题
for(int j=0;j<m;j++)
{
if(map[i][j]=='S')
{
sx=i;sy=j;
}
else if(map[i][j]=='D')
{
ex=i;ey=j;
}
else if(map[i][j]=='X')
wall++;
}
}
if(m*n-wall<=t) printf("NO\n");
else
{
ok=0;
map[sx][sy]='X';
dfs(sx,sy,0);
if(ok) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}