hdoj1010:迷宫问题:DFS-剪枝实现
#include <iostream>
#include <math.h>
using namespace std;
int N,M,T,di,dj,escape;
char map[10][10];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void dfs_search(int si,int sj,int step)
{
int newi,newj;
if(si==di && sj==dj && step==T)
escape=1;
if(escape==1)
return;
int temp=T-step-abs(si-di)-abs(sj-dj);//剪枝②
if(temp<0 || temp&1)
return;
for(int i=0;i<4;i++)
{
newi=si+dir[i][0];
newj=sj+dir[i][1];
if(map[newi][newj]!='X')
{
map[newi][newj]='X';
dfs_search(newi,newj,step+1);
map[newi][newj]='.';
}
}
}
void main()
{
int si,sj;
while(1)
{
int wall=0;
cin>>N>>M>>T;
if(N==0 && M==0 && T==0)
break;
for(int i=0;i<=N;i++)
map[i][0]=map[i][M+1]='X';
for(int i=1;i<=M;i++)
map[0][i]=map[N+1][i]='X';
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{si=i;sj=j;}
else if(map[i][j]=='D')
{di=i;dj=j;}
else if(map[i][j]=='X')
wall++;
}
if(T>=N*M-wall)//剪枝①
{
cout<<"NO"<<endl;
continue;//情况处理干净
}
map[si][sj]='X';
escape=0;
dfs_search(si,sj,0);
if(escape==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
基于深度优先搜索的回溯算法(递归剪枝及奇偶性剪枝好题!):HDOJ 1010 - Tempter of the Bone
2011-03-12 21:24
题目大意 给出起始位置和终点位置,要求在指定的时间刚好达到终点,每移动一步为一秒钟,并且不能返回。 题目分析 |