打卡信奥刷题(2645)用C++实现信奥题 P2739 [USACO4.4] 棋盘游戏 Shuttle Puzzle

P2739 [USACO4.4] 棋盘游戏 Shuttle Puzzle

题目描述

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

  • 初始状态:WWW_BBB_ 代表空格)
  • 目标状态:BBB_WWW

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

  • 你可以把一个棋子移到与它相邻的空格;
  • 你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。

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

这里是大小为 333 的棋盘游戏的解,包括初始状态,中间状态和目标状态:

WWW_BBB →\rightarrow WW_WBBB →\rightarrow WWBW_BB →\rightarrow WWBWB_B →\rightarrow WWB_BWB →\rightarrow W_BWBWB →\rightarrow _WBWBWB →\rightarrow BW_WBWB →\rightarrow BWBW_WB →\rightarrow BWBWBW_ →\rightarrow BWBWB_W →\rightarrow BWB_BWW →\rightarrow B_BWBWW →\rightarrow BB_WBWW →\rightarrow BBBW_WW →\rightarrow BBB_WWW

请编一个程序求解大小为 NNN 的棋盘游戏(1≤N≤121 \le N \le 121N12)。要求用最少的移动步数实现。

输入格式

一个正整数 NNN,表示棋盘游戏的大小。

输出格式

输出用每一步移动的棋子移动前在棋盘的位置(位置从左到右依次为 1,2,…,2N+11,2,\dots,2N+11,2,,2N+1)表示的序列,每个数字之间以空格分隔,每行 202020 个数(最后一行可以少于 202020 个数)。

输出的解还应当有最小的字典顺序,即如果有多组移动步数最小的解,输出第一个数最小的解;如果还有多组,输出第二个数最小的解,以此类推。

输入输出样例 #1

输入 #1

3

输出 #1

3 5 6 4 2 1 3 5 7 6 4 2 3 5 4

说明/提示

题目翻译来自 NOCOW。

USACO Training Section 4.3

C++实现

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int res[1010];
int n,tot,len;

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n+1;i++)	{
		if (!(i%2))//奇数组
			for (int j=0;j<i;j++) res[++tot]=n-i+2+2*j;
		else//偶数组
			for (int j=0;j<i;j++) res[++tot]=n+i-2*j;
	}
	//输出
	for (int i=2;i<=tot;i++) 	{
		//这里其实可以写个函数,懒得改了=。=
		len++;if (len%20==0) len=0;
		if (!len) printf("%d\n",res[i]);
		else printf("%d ",res[i]);
	}
	for (int i=n;i>=1;i--)	{
		for (int j=(i*i-i)/2+1;j<=(i*i+i)/2;j++)		{
			len++;if (len%20==0) len=0;
			if (!len) printf("%d\n",res[j]);
			else printf("%d ",res[j]);
		}

	}

	return 0;
}


在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值