A Knight's Journey

来源:互联网 发布:java开发业务流程 编辑:程序博客网 时间:2024/05/29 19:22

给出n*m的棋盘,问马能否全部将棋盘遍历完,输出字典树最小的路径

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;const int maxn=30;bool vis[maxn][maxn],flag;int dx[]= { -1, 1, -2, 2, -2, 2, -1, 1 };int dy[] = { -2, -2, -1, -1, 1, 1, 2, 2 };//顺序不能乱int n,m,end;char s[60];bool ok(int x,int y){    return x>=0&&x<n&&y>=0&&y<m;}void dfs(int x,int y,int cnt,char *s){    if(flag)        return;    if(cnt==end)    {        puts(s);        flag=true;        return;    }    for(int i=0;i<8;i++)    {        int xx=x+dx[i];int yy=y+dy[i];        if(ok(xx,yy)&&!vis[xx][yy])        {            vis[xx][yy]=true;            s[cnt]=yy+'A';            s[cnt+1]=xx+'1';            dfs(xx,yy,cnt+2,s);            vis[xx][yy]=false;        }    }}int main(){    int t=0;    int cas=0;    scanf("%d",&t);    while(t--)    {       printf("Scenario #%d:\n",++cas);        scanf("%d%d", &n, &m);        end = n * m * 2;        flag = false;        for (int j = 0; j < m; j++) {//先枚举列,以得到最小字典序            for (int i = 0; i < n; i++) {                memset(vis, 0, sizeof(vis));                memset(s, 0, sizeof(s));                s[0] = j + 'A';                s[1] = i + '1';                vis[i][j]=true;//记得标记。。                dfs(i, j, 2, s);                if (!flag)                    goto endloop;            }        }      endloop: if (!flag)            puts("impossible");        puts("");    }}


1 0
原创粉丝点击