zoj 2110 很好的dfs+奇偶剪枝

//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的
//剪纸奇偶剪枝加dfs
#include<stdio.h>
#include<queue>
#include<math.h>
#include<string.h>
using namespace std;
#define N  10
char ma[N][N];
struct node {
int x,y,step;
}ss,tt;
int dis[4][2]={1,0,-1,0,0,1,0,-1},n,m,t;
int vis[N][N];
int judge(int x,int y) {
if(ma[x][y]!='X'&&x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y])//刚开始这里少些!vis[x][y]导致wa
    return 1;
return 0;
}
int dfs(int x,int y,int step) {
 int xx,yy,st,i;
 if(ma[x][y]=='D'&&step==t)return 1;
 if(step>=t)  return 0;
 for(i=0;i<4;i++) {
    xx=x+dis[i][0];
    yy=y+dis[i][1];
    st=step+1;
    if(judge(xx,yy)) {
    vis[xx][yy]=1;
    if(dfs(xx,yy,st))return 1;
    vis[xx][yy]=0;
    }
 }
 return 0;
}
int main() {
   int i,j,k;
   while(scanf("%d%d%d",&n,&m,&t),n||m||t) {
      for(i=1;i<=n;i++)
        scanf("%s",ma[i]+1);
        k=0;
     for(i=1;i<=n;i++)
     for(j=1;j<=m;j++) {
        if(ma[i][j]=='S') {
            ss.x=i;
            ss.y=j;
        }
        if(ma[i][j]=='D') {
            tt.x=i;
            tt.y=j;
        }
        if(ma[i][j]=='X')
            k++;
     }
     if(n*m-k<t||(((int)fabs(tt.x-ss.x)+(int)fabs(tt.y-ss.y))%2!=t%2)) {
        printf("NO\n");
        continue;
     }
     memset(vis,0,sizeof(vis));
     vis[ss.x][ss.y]=1;
     if(dfs(ss.x,ss.y,0))
     printf("YES\n");
     else
        printf("NO\n");
   }
return 0;
}

posted @ 2014-09-16 16:48  HYDhyd  阅读(115)  评论(0编辑  收藏  举报