hdu 1010DFS

来源:互联网 发布:Mac爱奇艺视频转换mp4 编辑:程序博客网 时间:2024/05/17 05:50
//几个剪枝的方法如果不明白再问我
#include <iostream>using namespace std;int row,column,time;int op[4][2] = {-1,0,1,0,0,-1,0,1};char grap[10][10];int start_x,start_y,end_x,end_y;  //起点,终点int count;int sign;//当前点的X,Y坐标,t为起点到当前点的时间void dfs(int x,int y,int t){int X,Y;int i;if(sign)  //如果已经找到解了,都要返回{return ;}if(end_x == x && end_y == y && t == time)  //找到目标{sign = 1;return ;}if( (time - t) % 2 != (x+y+end_x+end_y) % 2 )  //奇偶减枝法{return ;}if(abs(x-end_x) + abs(y-end_y) > time - t)   //当前点到终点的最短时间若比剩余的时间还长的话{return;}for(i=0;i<4;i++){X = x + op[i][0];Y = y + op[i][1];if(X <= 0 || X > row || Y <= 0 || Y > column) //判断是否越界{continue;}if(grap[X][Y] != 'X'){grap[X][Y] = 'X';  //将走过的.变为Xdfs(X,Y,t+1); //往下搜索,t+1grap[X][Y] = '.';  //回溯恢复X为.}}}int main(){int i,j;while(cin>>row>>column>>time,row+column+time){count = 0;sign = 0;for(i=1;i<=row;i++){for(j=1;j<=column;j++){cin>>grap[i][j];//找到起点if(grap[i][j] == 'S'){start_x = i;start_y = j;grap[i][j] = 'X'; //将起点标记为'X',不能重复走}//找到终点if(grap[i][j] == 'D'){end_x = i;end_y = j;}if(grap[i][j] == '.'){count++;}}}//总共可以走的步数如果比给定时间还少if(count + 1 < time){cout<<"NO"<<endl;continue;}//从起点开始搜索dfs(start_x,start_y,0);if(sign){cout<<"YES"<<endl;}elsecout<<"NO"<<endl;}return 0;}

原创粉丝点击