分析:搜索题,注意剪枝。
#include<iostream> using namespace std; int dfs(int si,int sj,int ei,int ej,int mt); char map[8][8]; int m,n,fa; int main() { int t,i,j,wall,sti,stj,eni,enj; while(cin>>n>>m>>t &&(n||m||t)) { wall=0; fa=0; for(i=1;i<=n;i++) { getchar(); for(j=1;j<=m;++j) { cin>>map[i][j]; if(map[i][j]=='X') { wall++; } else if(map[i][j]=='S') { sti=i; stj=j; } else if(map[i][j]=='D') { eni=i; enj=j; } } } if(wall>=n*m-t) { cout<<"NO"<<endl; continue; } map[sti][stj]='X'; dfs(sti,stj,eni,enj,t); if(fa) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } return 0; } int dfs(int si,int sj,int ei,int ej,int mt) { int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int temp,i; if(mt<0) return 0; if(si<1||sj<1||si>n||sj>m) return 0; temp=mt-(ei-si)-(ej-sj); if(temp<0 || temp&1) return 0; if(map[si][sj]==map[ei][ej] && mt==0) { fa=1; return 1; } for(i=0;i<4;i++) { if(map[si+dir[i][0]][sj+dir[i][1]]!='X') { map[si+dir[i][0]][sj+dir[i][1]]='X'; if(!dfs(si+dir[i][0],sj+dir[i][1],ei,ej,mt-1)) { map[si+dir[i][0]][sj+dir[i][1]]='.'; } else { return 1; } } } return 0; }
HDU ACM 1010 Tempter of the Bone ->简单搜索
原文地址:http://blog.csdn.net/a809146548/article/details/45507513