Tempter of the Bone 奇偶剪枝(深搜)
来源:互联网 发布:python数据采集 pdf 编辑:程序博客网 时间:2024/05/21 15:38
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <iostream> #include <algorithm> bool visit[8][8];char map[8][8];int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};int Time,row,col,flag,sx,sy,ex,ey;void dfs(int x,int y,int step){ int tx,ty,Min,tstep; if(map[x][y]=='X') return ; if(flag) return ; if(x==ex&&y==ey&&step==Time) {flag=1;return;} if(step>=Time) return ; Min=(int)(fabs((double)(x-ex))+fabs((double)(y-ey))); if(Min>Time-step) return ; if(Min%2!=(Time-step)%2)return; if(map[ex+1][ey]!='.'&&map[ex-1][ey]!='.'&&map[ex][ey+1]!='.'&&map[ex][ey-1]!='.')return; for(int i=0;i<4;i++) { tx=x+dx[i]; ty=y+dy[i]; tstep=step+1; if(tx<0||tx>=row||ty<0||ty>=col) continue ; if(!visit[tx][ty]) { visit[tx][ty]=true; dfs(tx,ty,tstep); visit[tx][ty]=false; if(flag)return; } } }int main(){ freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); int i,j,op,num; while(scanf("%d %d %d",&row,&col,&Time)==3) { if(row+col+Time==0) break; num=0; memset(visit,false,sizeof(visit)); for(i=0;i<row;i++) { getchar(); for(j=0;j<col;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S'){ sx=i; sy=j;} else if(map[i][j]=='D') { ex=i; ey=j;} else num++; } } getchar(); if(num<Time-1||abs(sx-ex)+abs(sy-ey)>Time||( sx + sy + ex + ey +Time )%2==1) { printf("NO\n"); continue; } /* for(i=0;i<row;i++) { for(j=0;j<col;j++) { printf("%c",map[i][j]); } printf("\n"); } */ flag=0; visit[sx][sy]=true; dfs(sx,sy,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}