读书人

再次大牛

发布时间: 2012-05-14 15:24:34 作者: rapoo

再次求助大牛
杭电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;} 

读书人网 >C语言

热点推荐