题意 : q行 p列
找到是否有一个位置可以让马从这个位置开始跳。跳完。需要按列的顺序 从小到大按最小的顺序
既然可以跳到任何一个位置。那么可以在棋盘上形成循环,可以遍历到所有格子,按顺序输出则从A1开始搜索
此题为找是否有解,且最优
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;
struct Tree
{
int x;
int y;
}ans[2500];
int mapp[30][30];
int flag[30][30];
int p,q;
int win=0;
void dfs(int x,int y,int cot)
{
int next[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//八个方向,有顺序要求
ans[cot].x=x;
ans[cot].y=y;
if(cot==p*q)
{
win=1;
return;
}
for(int i=0;i<=7;i++)
{
int tx=next[i][0]+x;
int ty=next[i][1]+y;
if(tx<1||tx>p||ty<1||ty>q)
continue;
if(flag[tx][ty]==0&&!win)
{
flag[tx][ty]=1;
dfs(tx,ty,cot+1);
flag[tx][ty]=0;
}
}
}
int main()
{
int n;
cin>>n;
for(int ttt=1;ttt<=n;ttt++)
{
memset(flag,0,sizeof(flag));
cin>>q>>p;
flag[1][1]=1;
win=0;
dfs(1,1,1);
printf("Scenario #%d:\n",ttt);
if(win==0)
printf("impossible\n");
else
{
for(int i=1;i<=p*q;i++)
printf("%c%d",ans[i].x+'A'-1,ans[i].y);
printf("\n");
}
if(ttt!=n)
printf("\n");//输出有坑!!
}
}