p0j 2488 A Knight's Journey

来源:互联网 发布:java启动exe程序 编辑:程序博客网 时间:2024/06/02 06:12

题目链接


题目大意:判断一个m*n的棋盘,能否用马步踏满

                  能输出字典序最小的一个

                   行(1,2,3.........)

                    列(A,B,C.......)


解题思路:用dfs遍历棋盘用v[][]记录是否踏过

                  用数组[][2]记录踏的顺序,如可踏满,则遍历输出即可


注意事项:输出坐标时先列后行

                 要字典序最小,8个方向的递归是有顺序的

                 编号从1开始

#include <cstdio>#include<iostream>#include<cstring>using namespace std;int p,q;int n[26*26+3][2];   //记录顺序bool v[28][28];       //访问标记bool f=0;             //踏满标记int z[8][2]={   {-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}  }   ;       //8个坐标void dfs(int x,int y,int t){    v[x][y]=1;    n[t][0]=x;    n[t][1]=y;    if(t==p*q)    {        f=1;        return;    }    else    {        int nx,ny;        for(int i=0;i<8;++i)        {            nx=x+z[i][0];            ny=y+z[i][1];        if(nx>=0&&nx<p&&ny>=0&&ny<q&&v[nx][ny]==0)        {              dfs(nx,ny,t+1);            v[nx][ny]=0;         if(f)            return;        }        }    }}int main(){    int qq;    cin>>qq;    for(int i=0;i<qq;++i)    {         cin>>p>>q;         cout<<"Scenario #"<<i+1<<":\n";         memset(v,0,sizeof(v));         f=0;         dfs(0,0,1);         if(!f)            cout<<"impossible"<<endl;         else            {                 for(int i=1;i<=q*p;++i)                 {                 printf("%c%d",n[i][1]+'A',n[i][0]+1);                 }                 cout<<endl;            }          if(i!=qq-1)            cout<<endl;    }   return 0;}

0 0