91 棋盘游戏

91 棋盘游戏

作者: xxx时间限制: 1S章节: 宽度优先搜索

问题描述 :

大小为3的棋盘游戏里有3个白色棋子,3个黑色棋子,和一个有7个格子一线排开的木盒子。3个白棋子被放在一头,3个黑棋子被放在另一头,中间的格子空着。

初始状态: WWW_BBB

目标状态: BBB_WWW

在这个游戏里有两种移动方法是允许的:

  1. 你可以把一个棋子移到与它相邻的空格;

  2. 你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。

大小为N的棋盘游戏包括N个白棋子,N个黑棋子,还有有2N+1个格子的木盒子。

这里是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

请编一个程序解大小为N的棋盘游戏(1 <= N <= 12)。要求用最少的移动步数实现。

输入说明 :

一个整数N。

输出说明 :

用空格在棋盘的位置(位置从左到右依次为1, 2, ..., 2N+1)表示棋盘的状态。输出棋盘的状态变换序列,每行20个数(除了最后一行)。 输出的解还应当有最小的字典顺序(即如果有多组移动步数最小的解,输出第一个数最小的解;如果还有多组,输出第二个数最小的解;...)。

输入范例 :
9
输出范例 :
9 11 12 10 8 7 9 11 13 14 12 10 8 6 5 7 9 11 13 15
16 14 12 10 8 6 4 3 5 7 9 11 13 15 17 18 16 14 12 10
8 6 4 2 1 3 5 7 9 11 13 15 17 19 18 16 14 12 10 8
6 4 2 3 5 7 9 11 13 15 17 16 14 12 10 8 6 4 5 7
9 11 13 15 14 12 10 8 6 7 9 11 13 12 10 8 9 11 10

code

#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int> num;
	int len = 2;
	int flag = 0;
	int m = n;
	while (len<=m+1)
	{
		if (flag == 0)
		{
			for (int i = 0; i < len; i++)
			{
				num.push_back(n);
				if (i != len - 1)
				{
					n += 2;
				}
			}
			flag = 1;
			n += 1;
		}
		else
		{
			for (int i = 0; i < len; i++)
			{
				num.push_back(n);
				if (i != len - 1)
				{
					n -= 2;
				}
			}
			flag = 0;
			n -= 1;
		}
		len++;
	}
	len -= 2;
	flag = 0;
	if (len % 2 == 0)
	{
		n = *(num.end() - 1) + 1;
		while (len >= 1)
		{
			if (flag == 0)
			{
				for (int i = 0; i < len; i++)
				{
					num.push_back(n);
					if (i != len - 1)
					{
						n += 2;
					}
				}
				flag = 1;
				n -= 1;
			}
			else
			{
				for (int i = 0; i < len; i++)
				{
					num.push_back(n);
					if (i != len - 1)
					{
						n -= 2;
					}
				}
				flag = 0;
				n += 1;
			}
			len--;
		}
	}
	else
	{
		n = *(num.end() - 1) - 1;
		while (len >= 1)
		{
			if (flag == 0)
			{
				for (int i = 0; i < len; i++)
				{
					num.push_back(n);
					if (i != len - 1)
					{
						n -= 2;
					}
				}
				flag = 1;
				n += 1;
			}
			else
			{
				for (int i = 0; i < len; i++)
				{
					num.push_back(n);
					if (i != len - 1)
					{
						n += 2;
					}
				}
				flag = 0;
				n -= 1;
			}
			len--;
		}
	}
	int count = 0,index=0;
	for (vector<int>::iterator it = num.begin(); it != num.end(); it++)
	{
		cout << *it;
		count++;
		index++;
		if (count < 20&&index<(int)num.size())
		{
			cout << " ";
		}
		if (count == 20)
		{
			cout << endl;
			count = 0;
		}
	}
	cout << endl;
	return 0;
}
Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
原文地址:https://www.cnblogs.com/VictorierJwr/p/12775691.html