一维跳棋是一种在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 ;
}

-

最新文章

  1. 【原创】Kakfa network包源代码分析
  2. Practical JAVA(二)关于对象的类型和equals函数
  3. Beaglebone Black&ndash;I2C 接 BMP280 获取当前温度
  4. SIM卡里的文件
  5. html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
  6. jQuery实现页内查找相关内容
  7. ModSecurity--web应用防火墙
  8. java web 优化札记
  9. Zlib文件压缩和解压
  10. Javascript的块级作用域
  11. C++函数声明和定义深度解析
  12. Visual Studio 如何给生成的exe加入多个图标资源
  13. STM32音乐播放器,文件查找的实现
  14. 解决Appium无元素可选的如何定位
  15. Qt开发陷阱一QSTACKWIDGET
  16. JS 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
  17. 手游开发之lua的class函数详解
  18. CH#46 磁力块 分块
  19. POJ 1904 King&amp;#39;s Quest(强连通)
  20. 【转】 PreTranslateMessage作用和使用方法

热门文章

  1. java核心-多线程(1)-知识大纲
  2. 十五、JavaScript之除法
  3. C++使用 scanf函数
  4. java高并发核心类 AQS(Abstract Queued Synchronizer)抽象队列同步器
  5. [题解] LuoguP4609 [FJOI2016]建筑师
  6. hdu 4300 Clairewd’s message 字符串哈希
  7. C++的随机数
  8. 字符串匹配之BF算法
  9. 吴裕雄--天生自然 JAVASCRIPT开发学习:输出
  10. PAT 2019 春