poj2488骑士之旅

题目大意:国际象棋里面的马,有那么8种跳法,然后题目给出一个棋盘的大小p*q, 求有没有路线可以使得这个马能把整个棋盘的格全部走一遍,有的话按照字典序将第一条路线打印出来。

注意:国际象棋是行是数字,列是字母,按照字典序A1B3....,是需要按照先列后行来处理的。

因为要找一条路径出来,所以考虑深度优先(DFS)

贴一下烂代码(o(╯□╰)o):

#include<iostream>
#include<string>
using namespace std;

int chess[27][27];
int path;
bool exist=0;
string rec;

void DFS(int y,int x,int szy,int szx)
{
    chess[x][y]=1;
    path++;
    rec.push_back(char(y+'A'));
    rec.push_back(char(x+'1'));
    //cout<<"Beginning:"<<rec<<endl;
    int increx,increy;//,flag=0;
    for(int n=0;n<8;n++)
    {
        switch(n){
            case 0:
                increy=-2;increx=-1;break;
            case 1:
                increy=-2;increx=1;break;
            case 2:
                increy=-1;increx=-2;break;
            case 3:
                increy=-1;increx=+2;break;
            case 4:
                increy=+1;increx=-2;break;
            case 5:
                increy=+1;increx=+2;break;
            case 6:
                increy=+2;increx=-1;break;
            case 7:
                increy=+2;increx=+1;break;
        }
        if(y+increy>=szy||y+increy<0||x+increx>=szx||x+increx<0) continue;
        else if(chess[x+increx][y+increy]==0)
        {
            DFS(y+increy,x+increx,szy,szx);
        }
    }

        if(path==szy*szx) 
        {
            //cout<<"result:"<<rec<<endl;
            exist=1;
        }
        else{
        path--;
        rec.erase(rec.end()-1);
        rec.erase(rec.end()-1);
        //cout<<"Delete:"<<rec<<endl;
        chess[x][y]=0;
        }

}



        

int main()
{
    int instan,p,q,i,j,k;
    cin>>instan;
    for(i=0;i<instan;i++)
    {
        exist=0;

        memset(chess,0,sizeof(chess));
        cin>>p>>q;
        cout<<"Scenario #"<<i+1<<":"<<endl;
        for(j=0;j<q;j++)
        {
            for(k=0;k<p;k++)
            {
                path=0;
                rec.clear();
                //cout<<"Start from "<<k<<" "<<j<<":"<<endl;
                DFS(j,k,q,p);
                if(exist==1) 
                {
                    cout<<rec<<endl;
                    break;
                }
                
            }
                if(exist==1) 
                {
                    break;
                }
        }
        if(exist==0) cout<<"impossible"<<endl;
        cout<<endl;

    }
    return 0;
}

 

posted on 2013-07-11 21:24  soyscut  阅读(405)  评论(0编辑  收藏  举报

导航