POJ2488,A Knight's Journey,DFS脑子快抽筋了这几天我会乱说?

来源:互联网 发布:js提示框自动消失 编辑:程序博客网 时间:2024/05/17 03:42

A Knight's Journey

Description

Background 
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey 
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans? 
Problem 
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.

Input

The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number. 
If no such path exist, you should output impossible on a single line.

Sample Input

31 12 34 3

Sample Output

Scenario #1:A1Scenario #2:impossibleScenario #3:A1B3C1A2B4C2A3B1C3A4B2C4


分析:

从左上角开始走遍棋盘,国际象棋跟中国象棋跳马一样...

注意遍历失败时的回溯...以及字典序给出顺序,那么方向数组就应该是dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}...而不是单纯的顺时针逆时针。

这里要说一下图相关的题,十几年的数学知识告诉我们坐标按(x,y)顺序给出。但在程序设计中一般都是行优先,也就是[i][j],很容易搞反...

要倍加小心。


code:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#define MAX 26using namespace std;int p,q;int vis[MAX][MAX],path[MAX+5][2];int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};bool ok;//用于记录是否遍历成功void dfs(int x,int y,int step){    path[step+1][0]=x;    path[step+1][1]=y;    if(step==p*q-1)    {        for(int i=1;i<=p*q;i++)            printf("%c%d",path[i][0]+'A'-1,path[i][1]);        printf("\n");        ok=true;        return ;    }    else for(int i=0;i<8;i++)    {        int nx=x+dir[i][0],ny=y+dir[i][1];        if(nx>0&&ny>0&&nx<=q&&ny<=p&&!vis[nx][ny])        {            vis[nx][ny]=1;            dfs(nx,ny,step+1);            if(!ok) vis[nx][ny]=0;//不成功的话回溯要将访问状态改成未访问        }    }}int main(){    int n,step,count=0;    scanf("%d",&n);    while(n--)    {        step=0;        ok=false;        count++;        memset(vis,0,sizeof(vis));        scanf("%d %d",&p,&q);        vis[1][1]=1;        printf("Scenario #%d:\n",count);        dfs(1,1,0);        if(!ok) printf("impossible\n");        printf("\n");    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 顺风车无人接单怎么办 来例假腰特别疼怎么办 把人撞死了全责怎么办 朝鲜与美合作对付中国怎么办 申请美国大学gpa不够怎么办 武装突袭3有地雷怎么办 辐射4狗肉跟丢了怎么办 洛奇英雄传死绑S怎么办 在老挝遇到坏人带枪怎么办 买了sd卡卡槽塞不下怎么办 现役军人家庭被邻居欺服怎么办 地铁买票买多了怎么办 免税店买的东西转机怎么办 绿能电动车坏了怎么办? 永久单车收不到验证码怎么办 24速山地车档乱了怎么办 新电瓶车被偷了怎么办 汽车前风挡玻璃砸出洞怎么办 凯迪拉克xt5钥匙掉了怎么办 凯迪拉克xt5媒体不好用怎么办 晒黄的白鞋怎么办 白鞋子被晒黄了怎么办? 耐克空军一号白色发黄怎么办 空军一号破皮了怎么办 匡威鞋帆布破了怎么办 脚腕起疙瘩很痒怎么办 跑步后脚踝微疼怎么办 跑步跑得脚疼怎么办 nike air 鞋头脱胶怎么办 耐克空军一号磨脚怎么办 白鞋刷完变黄了怎么办 乔丹气垫坏了怎么办 气垫鞋气垫坏了怎么办 建行u盾忘记密码怎么办 工商银行u盾忘记密码怎么办 民生银行不给u盾怎么办 银行不给开u盾怎么办 有车有空想赚点外快怎么办 车被注册了滴滴怎么办 快手号手机丢了怎么办 手机号码不停收到验证码怎么办