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

来源:互联网 发布:js特效 编辑:程序博客网 时间:2024/06/06 08:34

题意:一个骑士,按照“日”字走法, 问骑士能否在 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 100010using 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;}


0 0
原创粉丝点击