再次大牛
再次求助大牛
杭电1010题。
http://acm.hdu.edu.cn/showproblem.php?pid=1010
大概意思是:给你一个迷宫,给你一个出口,和你当前的位置,要求你在T时间内出去。如果不能够出去就打印No。迷宫内有几种标识。
‘X’表示是石头,可以走,但是一旦走过这石头在下一秒就编程不可以走的。
‘S’你一开始的位置
‘D’出口的位置
‘.'不可以走的地方
求解决啊。
------解决方案--------------------
这道题杭电课件里有,,好像要用到什么奇偶剪枝。。
------解决方案--------------------
杭电1010题。
http://acm.hdu.edu.cn/showproblem.php?pid=1010
大概意思是:给你一个迷宫,给你一个出口,和你当前的位置,要求你在T时间内出去。如果不能够出去就打印No。迷宫内有几种标识。
‘X’表示是石头,可以走,但是一旦走过这石头在下一秒就编程不可以走的。
‘S’你一开始的位置
‘D’出口的位置
‘.'不可以走的地方
求解决啊。
- C/C++ code
#include <iostream> #include <cmath> using namespace std; char maze[7][7]; bool bPath[7][7]; int N,M,T; int ptStartX,ptStartY,ptDoorX,ptDoorY; bool bFound; int Recur(bool Path[7][7],int x,int y,int nLength) { if (bFound==false && maze[x][y]=='D' && nLength==T) { bFound=true; cout<<"YES"<<endl; return 0; } else if (bFound) { return 0; } if (abs(x-ptDoorX)+abs(y-ptDoorY)>abs(T-nLength)) { return -1; } if (bFound==false && x-1>=0 && Path[x-1][y]==false && maze[x-1][y]!='S' && maze[x-1][y]!='X') { Path[x-1][y]=true; Recur(Path,x-1,y,nLength+1); Path[x-1][y]=false; } if (bFound==false &&x+1<N && Path[x+1][y]==false && maze[x+1][y]!='S'&& maze[x+1][y]!='X') { Path[x+1][y]=true; Recur(Path,x+1,y,nLength+1); Path[x+1][y]=false; } if (bFound==false &&y-1>=0 && Path[x][y-1]==false&& maze[x][y-1]!='S'&& maze[x][y-1]!='X') { Path[x][y-1]=true; Recur(Path,x,y-1,nLength+1); Path[x][y-1]=false; } if (bFound==false &&y+1<M && Path[x][y+1]==false &&maze[x][y+1]!='S'&& maze[x][y+1]!='X') { Path[x][y+1]=true; Recur(Path,x,y+1,nLength+1); Path[x][y+1]=false; } } int main(void) { int i,j; do { bFound=false; cin>>N>>M>>T; if (N==0 && M==0 &&T==0) { break; } for (i=0;i<N;++i) for (j=0;j<M;++j) { cin>>maze[i][j]; if (maze[i][j]=='S') { ptStartX=i; ptStartY=j; } else if (maze[i][j]=='D') { ptDoorX=i; ptDoorY=j; } bPath[i][j]=false; } Recur(bPath,ptStartX,ptStartY,0); if (bFound==false) { cout<<"NO"<<endl; } } while (1); return 0; }
------解决方案--------------------
这道题杭电课件里有,,好像要用到什么奇偶剪枝。。
------解决方案--------------------
- C/C++ code
#include <iostream> #include <cmath> using namespace std; char maze[7][7]; int N,M,T; int ptStartX,ptStartY,ptDoorX,ptDoorY; bool bFound; int Recur(int x,int y,int nLength) { char tmp; if (bFound==false && maze[x][y]=='D' && nLength==T) { bFound=true; cout<<"YES"<<endl; return 0; } else if (bFound) { return 0; } if (nLength>T || ((T-nLength)-abs(x-ptDoorX)-abs(y-ptDoorY))%2!=0) { return -1; } tmp = maze[x][y]; maze[x][y]='X'; if (bFound==false && x-1>=0 && maze[x-1][y]!='S' && maze[x-1][y]!='X') { Recur(x-1,y,nLength+1); } if (bFound==false &&x+1<N && maze[x+1][y]!='S'&& maze[x+1][y]!='X') { Recur(x+1,y,nLength+1); } if (bFound==false &&y-1>=0 && maze[x][y-1]!='S'&& maze[x][y-1]!='X') { Recur(x,y-1,nLength+1); } if (bFound==false &&y+1<M &&maze[x][y+1]!='S'&& maze[x][y+1]!='X') { Recur(x,y+1,nLength+1); } maze[x][y]=tmp; } int main(void) { int i,j; do { bFound=false; cin>>N>>M>>T; if (N==0 && M==0 &&T==0) { break; } for (i=0;i<N;++i) for (j=0;j<M;++j) { cin>>maze[i][j]; if (maze[i][j]=='S') { ptStartX=i; ptStartY=j; } else if (maze[i][j]=='D') { ptDoorX=i; ptDoorY=j; } } Recur(ptStartX,ptStartY,0); if (bFound==false) { cout<<"NO"<<endl; } } while (1); return 0; }