【DFS】hdu 1010 Tempter of the Bone(迷宫)

来源:互联网 发布:淘宝网店怎么关闭 编辑:程序博客网 时间:2024/05/17 23:59

http://acm.hdu.edu.cn/showproblem.php?pid=1010

分析:主要是正好在T时间到达

迷宫类输入时需要注意,x,y的边界范围


#include<iostream>#include<cstdio>#include<cmath>using namespace std;int N,M,Si,Sj,Di,Dj,flag,T;int a[4][2]={0,1,0,-1,-1,0,1,0};char str[10][10];void DFS(int x,int y,int ans){if(x==Di&&y==Dj&&T==ans) flag=1;if(flag) return;int t=T-ans-abs(x-Di)-abs(y-Dj);//奇偶剪枝if(t<0||t%2!=0) return;for(int i=0;i<4;i++){int x1=x+a[i][0],y1=y+a[i][1];if(x1<N&&x1>=0&&y1<M&&y>=0&&str[x1][y1]!='X')//{str[x1][y1]='X';BFS(x1,y1,ans+1);str[x1][y1]='.';}}}int main(){int i,j,count;while(scanf("%d%d%d",&N,&M,&T)&&N||M||T){count=0;for(i=0;i<N;i++)//X-N{scanf("%s",str[i]);for(j=0;j<M;j++)//Y-M{if(str[i][j]=='S')Si=i,Sj=j;else if(str[i][j]=='D')Di=i,Dj=j;else if(str[i][j]=='X')count++;}}flag=0;str[Si][Sj]='X';if(N*M-count<T)//可走'.'总数<T  {printf("NO\n");continue;}DFS(Si,Sj,0);if(flag) printf("YES\n");else printf("NO\n");}return 0;}