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; else mark[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; else cout<<"NO"<<endl; } return 0; }