一维跳棋是一种在1×(2N+1) 的棋盘上玩的游戏。一共有N个棋子,其中N 个是黑的,N 个是白的。游戏开始前,N 个白棋子被放在一头,N 个黑棋子被放在另一头,中间的格子空着。

在这个游戏里有两种移动方法是允许的:你可以把一个棋子移到与它相邻的空格;你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。

对于N=3 的情况,棋盘状态依次为:

 WWW BBB
WW WBBB
WWBW BB
WWBWB B
WWB BWB
W BWBWB
WBWBWB
BW WBWB
BWBW WB
BWBWBW
BWBWB W
BWB BWW
B BWBWW
BB WBWW
BBBW WW
BBB WWW

对应的空格所在的位置(从左数)为:3 5 6 4 2 1 3 5 7 6 4 2 3 5 4。

输入格式

输入仅一个整数,表示针对N(1≤N≤10) 的取值。

输出格式

依次输出空格所在棋盘的位置,每个整数间用空格分隔,每行5 个数(每行结尾无空格,最后一行可以不满5 个数;如果有多组移动步数最小的解,输出第一个数最小的解)

样例输入

 

样例输出


用二进制来表示棋盘的状态

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std; int n;
int P[(<<)*+];
bool vis[<<][];
struct node
{
int num;
int pos;
}; int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif scanf("%d",&n);
vector<node> a;
queue<int> qe;
int first=(<<n)-;
int last=first<<n;
printf("%d %d\n",first,last);
qe.push(a.size());
vis[first][n]=true;
a.push_back({first,n});
while(!qe.empty())
{
int id=qe.front();
qe.pop();
int num=a[id].num;
int pos=a[id].pos;
if(num==last&&pos==n)
{
vector<int> ans;
for(int i=id;i;i=P[i])
{
ans.push_back(*n-a[i].pos+);
}
reverse(ans.begin(),ans.end());
for(int i=;i<ans.size();i++)
printf("%d%c",ans[i],i%==?'\n':' ');
break;
}
//空格左边的棋子移动到空格位置
if(pos<*n)
{
int tn=num;
int tp=pos+;
if(!vis[tn][tp])
{
qe.push(a.size());
vis[tn][tp]=true;
P[a.size()]=id;
a.push_back({tn,tp});
}
}
//空格右边的棋子移动到空格位置
if(pos>)
{
int tn=num;
int tp=pos-;
if(!vis[tn][tp])
{
qe.push(a.size());
vis[tn][tp]=true;
P[a.size()]=id;
a.push_back({tn,tp});
}
}
//空格左边的棋子跳到空格位置
if(pos<=*n-&&((num>>pos+&)^(num>>pos&)))
{
int tn=num^(<<pos);
int tp=pos+;
if(!vis[tn][tp])
{
qe.push(a.size());
vis[tn][tp]=true;
P[a.size()]=id;
a.push_back({tn,tp});
}
}
//空格左边的棋子跳到空格位置
if(pos>=&&((num>>pos-&)^(num>>pos-&)))
{
int tn=num^(<<pos-);
int tp=pos-;
if(!vis[tn][tp])
{
qe.push(a.size());
vis[tn][tp]=true;
P[a.size()]=id;
a.push_back({tn,tp});
}
}
}
return ;
}

-

一维跳棋(BFS)的更多相关文章

  1. HDU 1548 (最基础的BFS了) A strange lift

    这是一维的BFS,而且没有什么变形,应该是最基础的BFS了吧 题意: 有这样一个奇葩的电梯,你在第i层的时候你只能选择上或者下Ki层,也就是你只能从第i层到达i+Ki或者i-Ki层.当然电梯最低只能在 ...

  2. hdu-2717(基础搜索bfs)

    题意:给你n和k,问你n最少花费多少代价能得到k: 有两种变换:1.n++或者n--: 2.n=n*2: 两种代价每次的花费都是1: 思路:一维的bfs,每次入队三个点,一个是n+1,一个是n-1,一 ...

  3. POj 1753--Flip Game(位运算+BFS)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30669   Accepted: 13345 Descr ...

  4. hdu_2717_Catch That Cow_bfs

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 题解:一维简单BFS,详细看代码,0ms. #include<cstdio> #in ...

  5. hdu 2717:Catch That Cow(bfs广搜,经典题,一维数组搜索)

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. 北京2018网络赛 hihocoder#1828 : Saving Tang Monk II (BFS + DP +多开一维)

    hihocoder 1828 :https://hihocoder.com/problemset/problem/1828 学习参考:https://www.cnblogs.com/tobyw/p/9 ...

  7. Safe Path(bfs+一维数组存图)

    题目链接:http://codeforces.com/gym/101755/problem/H 题目分析:先bfs一遍怪兽可以到达的点,再bfs人可以走的地方看可不可以到达终点: 很显然读到  2&l ...

  8. poj3278 Catch That Cow(简单的一维bfs)

    http://poj.org/problem?id=3278                                                                       ...

  9. 计蒜客 一维坐标的移动(BFS)

    在一个长度为 n 的坐标轴上,蒜头君想从 A 点 移动到 B 点.他的移动规则如下: 向前一步,坐标增加 1. 向后一步,坐标减少 1. 跳跃一步,使得坐标乘 2. 蒜头君不能移动到坐标小于 0 或大 ...

随机推荐

  1. (转)linux shell 的here document 用法 (cat << EOF)

    什么是Here Documen: Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下 cmd << delimiter Here Docu ...

  2. php.laravel.部署

    Laravel 的部署 D  参考laravel-china的做 | 其他参考 | 重要的参考 | Nginx github | 如果想要ssl 啊

  3. 第二阶段scrum-4

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 前端制作完成,数据库在制作中.

  4. PostAsync与GetAsync

    using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; u ...

  5. 14 SQLite数据库

    SQLite数据库SQLite 是一款轻型的数据库SQLite 的设计目标是嵌入式的SQLite 占用资源低SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机 ...

  6. MongoDB 教程

    版权所有,未经许可,禁止转载 章节 MongoDB 入门 MongoDB 优势 MongoDB 安装 MongoDB 数据建模 MongoDB 创建数据库 MongoDB 删除数据库 MongoDB ...

  7. QT多线程之---moveToThread用法

    在gui编程里,一个子函数的运行时间可能过长,界面就处于假死状态,原因是窗口是一个线程,子函数也在这个线程里,一些事件也要在这个线程里处理. 如果子函数运行时间过长,系统没有办法调用事件监听循环,gu ...

  8. android:padding和android:margin的区别 android:gravity和 android:layout_gravity 区别

    Android的Margin和Padding跟Html的是一样的.如下图所示:橙色边框(一个RelativeLayout或者LinearLayout)为例,最外层灰色为屏幕边框,黄色部分为Paddin ...

  9. Toolbar融入状态栏实现沉浸式遇到的问题

    这里写一个纠结我一下午的问题,目的是写一个toolbar和状态栏相融合的沉浸式的样子,遇到各种各样的问题,还好最后慢慢解决了. 一.首先在活动中将状态栏设为透明 @Override protected ...

  10. mysql行级锁和表级锁的区别

    表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低:行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高: