第一道DFS,对DFS有了一个大概的了解
1.用一个数组定义方向,这样的话可以依照字符串顺序来进行搜索。
2.dfs这个函数是模拟的放下棋子后的判断,而在dfs前后进行放祺和回溯(撤棋)
3.dfs走到最后,要么flag=1成功,要么失败,所以直接默认失败就好了。
4.在dfs开头先判断是否已经成功,再判断是否成功(我觉得反过来也可以),在进行操作。
5.ans数组来储存答案,如果失败不用再“清零”,因为后面的正确答案可以自动覆盖。
6.dfs还有一个参数step,这里看着很重要,不知道后面这个参数起到什么作用。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int cb[27][27];
int flag=0,ct=0,p,q;
int ans[27][2]={0};
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
void build(int p,int q)
{
for (int i=1;i<=q;i++)
for(int j=1;j<=p;j++)
{
cb[i][j]=0;
}
return ;
}
void dfs(int x,int y,int step)
{
if(flag)
return;
ans[step][0]=x;
ans[step][1]=y;
// printf("%c%d\n",'A'+ans[step][0]-1,ans[step][1]);
if(step==p*q)
{
// printf("step=p*q\n");
flag=1;
return;
}
else
{
for(int i=0;i<8;i++)
{
int nx,ny;
nx=x+dir[i][0];
ny=y+dir[i][1];
// printf("%d %d\n" ,q,p);
if(nx>0&&ny>0&&nx<=q&&ny<=p&&cb[nx][ny]==0)
{
// printf("%c%d\n",'A'+ans[step][0]-1,ans[step][1]);
//
// printf("search further\n");
cb[nx][ny]=1;
dfs(nx,ny,step+1);
cb[nx][ny]=0;
}
}
}
return;
}
int main(void)
{
int n;
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
scanf("%d %d",&p,&q);
build(p,q);
memset(ans,0,27*2*sizeof(int));
ct=0;
flag=0;
cb[1][1]=1;
dfs(1,1,1);
printf("Scenario #%d:\n",j);
if(!flag)
{
printf("impossible\n\n");
}
else
{
for(int i=1;i<=p*q;i++)
printf("%c%d",'A'+ans[i][0]-1,ans[i][1]);
printf("\n\n");
}
}
return 0;
}