0 0,,之前纠结了很久的一道题,今天上网翻了一下答案,发现是用搜索做的,然后发现现在对于搜索已经没有想法了。。。TAT,当初最好的难道不是搜索吗!!我以为我搜索好歹是入门了,但是居然不知道奇偶剪枝。。QAQ
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int n,m,t;
int flag,ji;
int sx,sy,ex,ey;
char a[10][10];
int vis[10][10];
int cmpx[4]={0,0,1,-1};
int cmpy[4]={1,-1,0,0};
bool check(int x,int y,int rem)
{
if(x<0||x>=n||y<0||y>=m) return false;
if(a[x][y]=='X'||vis[x][y]) return false;
int d=abs(x-ex)+abs(y-ey);
if((d&1)!=(rem&1)) return false;
return true;
}
void search(int x,int y,int d)
{
//printf("tx=%d ty=%d\n",x,y);
if(flag||d>t) return;
if(a[x][y]=='D')
{
if(d==t) flag=1;
return;
}
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int tx=x+cmpx[i],ty=y+cmpy[i];
if(!check(tx,ty,t-d-1)) continue;
search(tx,ty,d+1);
}
vis[x][y]=0;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(!n&&!m&&!t) break;
int tmp=0;
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
for(int j=0;j<m;j++)
{
if(a[i][j]=='S') sx=i,sy=j;
else if(a[i][j]=='D') ex=i,ey=j;
if(a[i][j]=='X') tmp++;
vis[i][j]=0;
}
}
int d=abs(sx-ex)+abs(sy-ey);
if((d&1)!=(t&1)||n*m-tmp<=t) {printf("NO\n");continue;}
flag=0;
ji=(d&1);
search(sx,sy,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}