hdu 1010
dfs+奇偶剪枝,关键在于奇偶剪枝的应用
#include <iostream>
#include <stdio.h>
using namespace std;
char s[10][10];
int vis[10][10];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int fx,fy;
int n,m,t;
int flag;
void dfs(int sx,int sy,int step)
{
int i;
if((t-step)%2!=(sx+sy+fx+fy)%2) return;//奇偶性剪枝
if(step==t)
{
if(sx==fx&&sy==fy) flag=1;
return;
}
for(i=0;i<4&&!flag;i++)
{
int tx=sx+d[i][0];
int ty=sy+d[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&!vis[tx][ty]&&s[tx][ty]!='X')
{
vis[sx][sy]=1;
dfs(tx,ty,step+1);
vis[sx][sy]=0;
}
}
}
int main()
{
while(cin>>n>>m>>t)
{
if(!n&&!m&&!t) break;
int i,j;
int sx,sy;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>s[i][j];
if(s[i][j]=='S')
{
sx=i;
sy=j;
}
if(s[i][j]=='D')
{
fx=i;
fy=j;
}
}
}
memset(vis,0,sizeof(vis));
flag=0;
vis[sx][sy]=1;
dfs(sx,sy,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

浙公网安备 33010602011771号