pku 2488 A Knight's Journey

来源:互联网 发布:软件研发人员职责 编辑:程序博客网 时间:2024/04/30 00:39

http://acm.pku.edu.cn/JudgeOnline/problem?id=2488

题意:给定p,q 求由任意位置开始访问,以何种路径能够访问完这个p*q的矩阵。

深度优先搜索。

#include <cstdio>#include <iostream>using namespace std;typedef struct{char x;char y;}Step;//路径节点结构体int point[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//所走路的步伐bool flag[50][50];//标记位int p,q;Step step[100];//存放路径节点int number;int count;bool dfs(int x,int y){    int i;int px,py;    if(count == p*q)return true;    for(i = 0;i < 8;i ++)    {        px = x+point[i][0];py = y+point[i][1];//所走步伐        if(px >= 1 && px <= q && py >= 1 && py <= p && flag[px][py] == false)//判断是否走出界以及该节点是否走过        {            count ++;//节点自加1            flag[px][py] = true;//标记为真            if(dfs(px,py))//判断该节点是否有下一个节点可走            {                step[number].y = py+'0';                step[number].x = px+64;//该节点的位置number ++;                return true;            }            flag[px][py] = false;//若没有下一个节点可走标记赋值为false            count --;//节点自减,减掉该节点        }    }    return false;}int main(){int i;int test,cas = 0;scanf("%d",&test);while(test --){memset(flag,false,sizeof(flag));//标记初始化flag[1][1] = true;//第一个节点标记为真count = 1;//节点初始化为1number = 0;scanf("%d%d",&p,&q);//输入长和宽printf("Scenario #%d:/n",++ cas);if(dfs(1,1))//由第一个节点开始深度优先遍历{step[number].y = '1';step[number].x = 'A';number ++;for(i = number - 1;i >= 0;i --)printf("%c%c",step[i].x,step[i].y);printf("/n");}elseprintf("impossible/n");printf("/n");}return 0 ;}
/*
31 12 34 3
Scenario #1:A1Scenario #2:impossibleScenario #3:A1B3C1A2B4C2A3B1C3A4B2C4
*/
原创粉丝点击