棋子的移动问题(递归问题)
棋子的移动问题
题目描述:
有2n个棋子(n>=4)排成一行,白子用0表示,黑子用1表示,例如n=5时初始状态为0 0 0 0 0 1 1 1 1 1 _ _ (右边至少有2个空位),要求通过棋子移动最终成为 _ _0 1 0 1 0 1 0 1 0 1 .
棋子移动规则:
1.每次必须同时移动相邻的两个棋子。
2.颜色不限,移动方向不限。
3.每次移动必须跳过若干棋子。
4.不能调换这两个棋子的位置。
题解:
递归出口为n=4;这时候我们可以求解。
move(a,3,4,8,9);
move(a,7,8,3,4);
move(a,1,2,7,8);
move(a,6,7,1,2);
move(a,0,1,6,7);
即可。a为数组,前面两个数为两相邻小球的初始位置,后面两数为小球要移动的位置。
当n=5时,我们可以move(a,4,5,10,11);move(a,8,9,4,5);这样得到 0 0 0 0 1 1 1 1 _ _ 0 1序列。然而前10项就是n=4的序列。
当为n时,move(a,n-1,n,2n,2n+1);move(a,2n-2,2n-1,n-1,n);
这是前2(n-1)项为n-1时的序列,如此递归求解即可。
代码:
#include<iostream>
using namespace std;
void move(char a[],int m1,int n1,int m2,int n2)
{char temp=a[m1];a[m1]=a[m2];a[m2]=temp;temp=a[n1];a[n1]=a[n2];a[n2]=temp;
}
void chess(char a[],int n)
{if(n==4){move(a,3,4,8,9);move(a,7,8,3,4);move(a,1,2,7,8);move(a,6,7,1,2);move(a,0,1,6,7);}else{move(a,n-1,n,2*n,2*n+1);move(a,2*n-2,2*n-1,n-1,n);chess(a,n-1);}
}
int main()
{int i,n;cin>>n; char a[2*n+2];for(i=0;i<n;i++){a[i]='0';a[n+i]='1';}a[2*n]='_';a[2*n+1]='_';chess(a,n);for(i=0;i<2*n+1;i++){cout<<a[i]<<" ";}cout<<"\n";return 0;}
棋子的移动问题(递归问题)相关推荐
- python 围棋按照坐标查找棋子_深度优先搜索及python实现围棋“吃子”
前言 "吃子"是围棋最基本的规则之一,但在编写围棋游戏要如何实现?深度优先搜索可以解决这个问题.本文分享的是个人使用深度优先搜索算法及python语言实现"吃子" ...
- 基于python pyqt的围棋游戏制作
文章目录 1.初始化棋盘 2.初始化棋子 3.开始游戏 4.落子设置 5.吃子判断 6 悔棋和弃一子 7 重新开始.推出与切换棋盘 8 显示 9 初始化 本文使用python中的pygame库设计制作 ...
- 深度优先搜索及python实现围棋“吃子”
文章目录 前言 一."吃子"和"气" 1."吃子"和"气"的概念 2.问题转化 二.深度优先搜索 1.表示方法 2.深度 ...
- 博弈五子棋(人机对战)算法改进
基于 EasyX 的五子棋程序. 界面依旧,唯一不同的是算法.改进前的 AI 眼光短浅,只顾当前局面.改进后的 AI 使用 DFS(深度优先搜索)进行对博弈树的遍历,再挑选分值最大的根节点进行落子.具 ...
- POJ 1753 翻棋子 (dfs+递归)。
终于来填坑了.依旧是递归的题目,最近做的都是关于递归的问题.下一个是汉诺塔问题. 这道题也是看了很多别人的博客才弄出来的,但是分析还是要试着自己写一下. 题意是这样的,有一个4*4的棋盘,你可以自定义 ...
- 递归——黑白棋子的移动(洛谷 P1259)
题目选自洛谷P1259 我们先分析一下样例 ooooooo*******--oooooo--******o* oooooo******--o*ooooo--*****o*o* ooooo*****-- ...
- 算法竞赛宝典 棋子移动 递归
大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 棋子移动
- 递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...
- ZOJ1002 Fire Net(非递归版)
以前用递归的回溯搜索思路做过一次,参见ZOJ1002 Fire Net(递归版),今天想着用非递归的方法试试看,呵呵,比我想象中要难啊,主要还是堆栈里究竟放什么,这一点上思路一直没理清.因此用了整整一 ...
最新文章
- bioperl 格式化genebank的输出
- spring三大核心学习
- 日常生活中如何获得低咖啡因的茶叶
- html 闪烁字,HTML最简单的文字闪烁代码
- 数模写作必备利器—latex
- MATLAB函数使用记录1-plot/line/set
- python绝对导入_[编程基础] Python中的绝对导入与相对导入
- View DrawingCache的理解
- bzoj 1833: [ZJOI2010]count 数字计数(数字0-9的个数)
- SpringBoot2整合Flyway(二)
- 转分享[Mac] QQ音乐Mac特别版 可以下载无损
- DocFetcher 本机文件搜索工具
- wps2019怎么调整字间距_wps2019表格和文字间距太大怎么调整?
- Python标准库(各种模块介绍)
- c语言列宽作用,c语言|格式化输入输出详解
- VS2017中MFC的C++设计中给其它窗口发中文消息
- c语言常用的运行速度优化,C语言程序设计优化(提速)
- C语言中汉字的存储和输出
- BZOJ3032 七夕祭 均分纸牌问题的变式 (前缀和+中位数)
- 基于双馈风机的调频电源改造方案