pku 2488 A Knight's Journey

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;//节点初始化为1
		number = 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");
		}
		else
			printf("impossible/n");
		printf("/n");
	}
	return 0 ;
}
/*
3
1 1
2 3
4 3
Scenario #1:
A1

Scenario #2:
impossible

Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值