很神奇的剪枝條件:奇偶剪枝
用到奇偶剪枝原理:
#include<cstdio>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include<string.h>#include<iostream>using namespace std;int dx[]={1,-1,0,0},dy[]={0,0,-1,1};char Map[7][7];int n,m,t;bool vis[7][7];bool ok;int ex,ey;int dis(int x,int y){ return abs(x-ex)+abs(y-ey);}void dfs(int x,int y,int step){ if(ok)return; if(Map[x][y]=='D'&&step==t) { ok=1;return ; } if(step>=t)return; int tmp=t-step-dis(x,y); if(tmp<0||tmp%2)return; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=dy[i]+y; if(xx>=0&&n>xx&&yy>=0&&yy<m&&!vis[xx][yy]&&Map[xx][yy]!='X') { vis[xx][yy]=true; dfs(xx,yy,step+1); vis[xx][yy]=false; } } }int main(){ int sx,sy,con=0; while(cin>>n>>m>>t,n+m+t) { con=0;ok=0; memset(vis,false,sizeof(vis)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>Map[i][j]; if(Map[i][j]=='S') {sx=i;sy=j;vis[i][j]=1;}//剛開始忘記把起點標記已訪問wa了一次 else if(Map[i][j]=='D') { ex=i;ey=j; } else if(Map[i][j]=='X') { con++; } } if(n*m-con>t) { dfs(sx,sy,0); } if(ok) printf("YES\n"); else printf("NO\n"); } return 0;}