POJ A Knight's Journey(2488) -dfs&打印路径

题意:一个骑士,按照“日”字走法, 问骑士能否在 p*q 的棋盘上,从某个点出发不重复走遍棋盘每个点,如果能,输出骑士每步的位置(按字典序),如果不能,则输出impossible。

题解:设A1为首位置(证明如果能走完的话,必存在一条起点为A1的路径);遍历时先选字典序最小的。

#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
#define prime 999983
#define maxn 100010
using namespace std;
typedef long long llong;
int n,m,t,tot=0;
int ok,stp;
bool vis[30][30];
int sm[30],sn[30];
int dx[8]={ -2,-2,-1,-1, 1, 1, 2, 2 };
int dy[8]={ -1, 1,-2, 2,-2, 2,-1, 1 };
void dfs(int x,int y){
    if(ok)   return;
    stp++;
    sm[stp]=x; sn[stp]=y;   vis[x][y]=1;
    if(stp==tot) {  ok =1;  return;  }
    for(int i=0;i<8;i++){
        int nx =x+dx[i];
        int ny =y+dy[i];
        if( !vis[nx][ny]&&nx>0&&ny>0&&nx<=m&&ny<=n )
        {   dfs(nx,ny);   stp--;    }
    }
    vis[x][y] =0;
}
int main()
{
    //freopen("D:\data.txt","r",stdin);
    int TT,tt=1,i,j,k;
    scanf("%d",&TT);
    while(tt<=TT){
        clearto(vis,0);
        scanf("%d %d",&n,&m);   //数字(1-n), 字母(1-m)
        ok =0;  stp =0;   tot =n*m;   dfs(1,1);
        printf("Scenario #%d:\n",tt);
        if(ok){
           for(i=1;i<=tot;i++)   printf("%c%d",sm[i]+64,sn[i]);  putchar(10);
        }
        else   printf("impossible\n");
        if(tt!=TT)     printf("\n");  tt++;
    }
    return 0;
}


你可能感兴趣的:(搜索,DFS)