p0j 2488 A Knight's Journey

题目链接


题目大意:判断一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值