hdu1401

这道博客介绍了如何利用双向广搜算法解决一个棋盘游戏中棋子移动的问题。游戏在8x8棋盘上进行,每步可以向空的相邻区域或跳过相邻棋子移动。题目要求在限制棋子移动步数的条件下,判断是否能将棋子移动到目标位置。博主提出的关键点包括棋盘状态的判重、排序处理以及使用八维数组进行标记。通过代码实现,博主展示了如何进行正向和反向广搜,并在过程中进行状态判重,以避免时间和内存的浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hud1401纸牌

题目描述:

Solitaire 是一种在 8x8 棋盘上玩的游戏。棋盘的行和列分别从1到8编号,分别从上到下和从左到右。

棋盘上有四个相同的棋子。在一次移动中,允许:

①将棋子移到空的相邻区域(向上、向下、向左或向右)

② 跳过相邻棋子到空的区域(向上、向下、向左或向右)

如图:

所以有四种走法:向上走一步;向右走一步,跳过右边相邻的;向下走一格,跳过下面那个;想左直接走一格。不过每个棋子只能走四步最多,题目的要求是给定你一个目标位置,和最初位置,在每个棋子只能最多走四步,且所有棋子不能走超过八步的要求下移动成目标位置,可以输出是的,不可以的输出否

 

 这道题采用双向的广搜算法,这道题的技巧还是很多的,最重要的是怎么对棋盘状态判重这个很重要,其次就是棋子有四个,开八维数组判重,但是四个棋子全排列有很多种坐标。这里就需要排序处理,按棋子坐标升序依次往八维数组里面放。其实也就是通过排序hash了,你也可以对四个棋子的全排列顺序进行标记。不过写的代码会很多。最好的标记就是按照棋子升序标记,这样就不会很麻烦。tbfs + sort排序,思路就是正向拓展四次,反向拓展四次,如果两个范围跑出来的圆圈能产生交点那么一定可以,如果tbfs跑出来的范围没有交点代表无法实现,这样就能避免内存消耗太大已经时间不理想的情况。
 

代码:


#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct point{                                                         //定义一个坐标结构体
    int x,y;
};
struct info{
    point a[4];                                            //定义一个结构体来记录数组
    int step;
}s,e;
bool map[10][10];
char v[8][8][8][8][8][8][8][8];                                //八位数组判重
int dx[] = {1,-1,0,0};
int dy[] = {0,0,-1,1};
queue<info>q[2];
void clear_set()                          //清空函数                            
{
    memset(v,false,sizeof(v));
    while(!q[0].empty()){
        q[0].pop();
    }
    while(!q[1].empty()){
        q[1].pop();
    }
    memset(v,0,sizeof(v));
}
bool cmp(point s1,point s2)                             //排序规则 ,先按纵坐标大小排序,再按横坐标排序。
{
    if(s1.x == s2.x){
        return s1.y < s2.y;         
 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值