hooj 1010 经典深搜

来源:互联网 发布:2017电脑桌面日历软件 编辑:程序博客网 时间:2024/05/28 16:05
c++能过。。。。c语言的话就一直wa 求解
#include<iostream>#include<cmath>#include<cstring>#include<queue>int fangxiang[4][2]={{-1,0},{1,0},{0,-1},{0,1}};const int MAX=101;char map[MAX][MAX];int mark[MAX][MAX];int  n,m,t;int start_x,start_y;int end_x,end_y;using namespace std;bool DFS(int x,int y,int step){int i,a,b;if(map[x][y]=='D'&&step==t)return true;if(x<1||x>n|y<1||y>m)return false;if(step>=t)//剪枝1:当step>=T时还没有找到D点 return false;if(t-step<(abs(x-end_x)+abs(y-end_y)))//剪枝2:还需要的步数比理论上的最短距离还小  return false;if((t-step-(abs(x-end_x)+abs(y-end_y)))%2!=0) //剪枝3:比理论上的最短距离多出来的必是偶数 return false;for(i=0;i<4;i++){a=x+fangxiang[i][0];b=y+fangxiang[i][1];if(a<=n&&a>=1&&b>=1&&b<=m&&map[a][b]!='X'&&!mark[a][b]) //判断三个条件:1.检验_x,_y是否越界。2.看vis[][]是否访问过。3.看map[][]是否是墙 {mark[a][b]=1;if(DFS(a,b,step+1))return true;elsemark[a][b]=0;}}return false;}int main(){int i,j;while(cin>>n>>m>>t&&(n||m||t)){memset(mark,0,sizeof(mark));for(i=1;i<=n;i++){for(j=1;j<=m;j++){ cin>>map[i][j]; if(map[i][j]=='S') { start_x=i; start_y=j; } if(map[i][j]=='D') { end_x=i;end_y=j; }}}mark[start_x][start_y]=1;if(DFS(start_x,start_y,0))cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;}
原创粉丝点击