HDOJ 1010 Tempter of the Bone

来源:互联网 发布:淘宝上的菲戈体育 编辑:程序博客网 时间:2024/06/05 18:01

点击打开链接

题目大意:

输入N,M,表示迷宫的长宽,T表示需要恰好在第T秒到达D点,起始位置S点;

深搜+剪枝(奇偶剪枝)点击打开链接

设起点为(x1,y1),(x2,y2)

abs(x2-x1)+abs(y1-y2)的奇偶性与T的奇偶性相同!

因为题目要求t秒恰好到达,所以(t-step)的奇偶性与abs(x2-x1)+abs(y2-y1)的奇偶性相同

因此int temp=(t-step)-(abs(x2-x1)+abs(y2-y1))必须为偶数,step为已走过的秒数

#include<iostream>#include<cstring>#include<cstdlib>#define MAX 10using namespace std;char map[MAX][MAX];int N,M,T;int s_x,s_y,f_x,f_y;int floag;int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};void dfs(int x,int y,int step){int temp;if(x==f_x && y==f_y && step==T){floag=1;return;}temp=T-step-(abs(f_x-x)+abs(f_y-y));//奇偶剪枝if( temp%2 ==1 || temp<0)return;for(int i=0;i<4;i++){if(x+dir[i][0]>0 &&x+dir[i][0]<=N && y+dir[i][1]>0 &&y+dir[i][1]<=M ){if(map[x+dir[i][0]][y+dir[i][1]]!='X'){map[x+dir[i][0]][y+dir[i][1]]='X';dfs(x+dir[i][0],y+dir[i][1],step+1);/*dfs(x-1,y,step+1);dfs(x+1,y,step+1);dfs(x,y-1,step+1);dfs(x,y+1,step+1);*/if(floag)return;map[x+dir[i][0]][y+dir[i][1]]='.';}}}return;}int main(){while (cin>>N>>M>>T && (M+N+T)!=0){int wall=0;s_x=s_y=f_x=f_y=0;memset(map,0,sizeof(map));for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){cin>>map[i][j];if(map[i][j]=='S'){s_x=i;s_y=j;}if(map[i][j]=='D'){f_x=i;f_y=j;}if(map[i][j]=='X')wall++;}}if(T>=N*M-wall){//剪枝,当时间t大于可走的路数时,到不了,剪掉cout<<"NO\n";continue;}floag=0;map[s_x][s_y]='X';dfs(s_x,s_y,0);if(floag)printf("YES\n");else printf("NO\n");}//system("pause");}