Shuttle Puzzle题解
Traditional

The Shuttle Puzzle of size 3 consists of 3 white marbles, 3 black marbles, and a strip of wood with 7 holes. The marbles of the same color are placed in the holes at the opposite ends of the strip, leaving the center hole empty.

INITIAL STATE: WWW_BBB
GOAL STATE: BBB_WWW

To solve the shuttle puzzle, use only two types of moves. Move 1 marble 1 space (into the empty hole) or jump 1 marble over 1 marble of the opposite color (into the empty hole). You may not back up, and you may not jump over 2 marbles.

A Shuttle Puzzle of size N consists of N white marbles and N black marbles and 2N+1 holes.

Here's one solution for the problem of size 3 showing the initial, intermediate, and end states:

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

Write a program that will solve the SHUTTLE PUZZLE for any size N (1 <= N <= 12) in the minimum number of moves and display the successive moves, 20 per line.

PROGRAM NAME: shuttle

INPUT FORMAT

A single line with the integer N.

SAMPLE INPUT (file shuttle.in)

3

OUTPUT FORMAT

The list of moves expressed as space-separated integers, 20 per line (except possibly the last line). Number the marbles/holes from the left, starting with one.

Output the the solution that would appear first among the set of minimal solutions sorted numerically (first by the first number, using the second number for ties, and so on).

SAMPLE OUTPUT (file shuttle.out)

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

描述

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

初始状态: WWW_BBB
目标状态: BBB_WWW

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

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

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

这里是3-棋盘游戏的解,包括初始状态,中间状态和目标状态:

 WWW BBBWW WBBBWWBW BBWWBWB BWWB BWBW BWBWBWBWBWBBW WBWBBWBW WBBWBWBW BWBWB WBWB BWWB BWBWWBB WBWWBBBW WWBBB WWW

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

格式

PROGRAM NAME: shuttle

INPUT FORMAT:

(file shuttle.in)

一个整数N。

OUTPUT FORMAT:

(file shuttle.out)

输出用移动的棋子在棋盘的位置(位置从左到右依次为1, 2, ..., 2N+1)表示的变换序列,每个数字之间以空格分隔,每行20个数(除了最后一行)。

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

SAMPLE INPUT

3

SAMPLE OUTPUT

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

-----------------------------------------------------------分割线---------------------------------------------------------------------

刚开始看这道题毫无头绪。N<=12,心想着可能又是搜索+剪枝。于是我就直接打开NOCOW上的题解。

太神了!一大牛的找规律把握吓傻了!

Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。

先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为

4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例)

5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4)

我们凭借极其敏锐的眼光发现这组序列为

435 642 1357 642 35 4 (n=3,样例)

5 46 753 2468 97531 2468 753 46 5 (n=4)

即长度为1,2,3,4,...,n,n+1,n,...,4,3,2,1这样的2n+1组等差序列

我们讨论第1~n+1组序列,这些序列满足

  *公差的绝对值为2

  *奇数组为降序列,偶数组为升序列

  *对于第i组(1<=i<=n+1),若为奇数组则首项为n+i,偶数组则首项为n-i+2

对于第n+2~2n+1组,可以由对称性求出。了!一大牛的找规律把握吓傻了!

我就根据他那强大的公式编了个程序,然后0.000s秒过。。

于是我开始想了,汉诺塔问题有规律吗?……

代码:

/*
ID:juan1973
LANG:C++
TASK:shuttle
*/
#include<stdio.h>
using namespace std;
int a[101][101];
int start,n,i,j;
int main()
{freopen("shuttle.in","r",stdin);freopen("shuttle.out","w",stdout);scanf("%ld",&n);int cnt=0;a[1][1]=n+1;a[1][0]=1;for (i=2;i<=n+1;i++)if (a[i-1][1]%2==1){a[i][0]=a[i-1][0]+1;if (n%2==0){start=n-i;for (j=1;j<=a[i][0];j++){start+=2;a[i][j]=start;cnt++;if (cnt%20==0) printf("%ld\n",a[i][j]);else printf("%ld ",a[i][j]);}}else{start=n-i+2+2*a[i][0];for (j=1;j<=a[i][0];j++){start-=2;a[i][j]=start;cnt++;if (cnt%20==0) printf("%ld\n",a[i][j]);else printf("%ld ",a[i][j]);}}}else {if (n%2==0){a[i][0]=a[i-1][0]+1;start=n+i+2;for (j=1;j<=a[i][0];j++){start-=2;a[i][j]=start;cnt++;if (cnt%20==0) printf("%ld\n",a[i][j]);else printf("%ld ",a[i][j]);}}else{a[i][0]=a[i-1][0]+1;start=n+i-2*a[i][0];for (j=1;j<=a[i][0];j++){start+=2;a[i][j]=start;cnt++;if (cnt%20==0) printf("%ld\n",a[i][j]);else printf("%ld ",a[i][j]);}}}for (i=n;i>1;i--)for (j=1;j<=a[i][0];j++){cnt++;if (cnt%20==0) printf("%ld\n",a[i][j]);else printf("%ld ",a[i][j]);}printf("%ld\n",n+1);return 0;
}

usaco training 4.4.1 Shuttle Puzzle 题解相关推荐

  1. 【USACO training】Chapter 1 入门

    整理的算法模板合集: ACM模板 目录 Section 1.1 介绍 Section 1.2 提交解决方案,任务类型,特殊问题 1.2.1 AcWing 1339. 你的旅途由此开始(字符串模拟) 1 ...

  2. USACO 1月 2021-2022 January Contest Bronze 题解

    目录 你好啊我又又又来了 要准备usaco的铁铁们可以参考这个文章哦!USACO题库 - 比Usaco Training更好用的网站_GeekAlice的博客-CSDN博客https://blog.c ...

  3. USACO Training 综述

    USACO Training 综述 http://train.usaco.org/usacogate(USACO 97道题) USA Computing Olympiad 是美国高校的信息学测评网站, ...

  4. USACO Training Section 1.2 双重回文数 Dual Palindrom

    题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就 ...

  5. USACO Training Section 1.1 坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  6. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

  7. USACO Training Section 1.1 Your Ride Is Here

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...

  8. usaco4.4.1 Shuttle Puzzle

    一 原题 Shuttle Puzzle Traditional The Shuttle Puzzle of size 3 consists of 3 white marbles, 3 black ma ...

  9. usaco shuttle puzzle(dfs剪枝)

    这题一看我也以为找规律,然后无法下手之后又想到bfs最后看题解是用dfs大神dfs用的出神入化. 不过这题好像可以找规律. /* ID:jinbo wu TASK: shuttle LANG:C++ ...

最新文章

  1. 利用CMake编译内核模块
  2. java jdbc标签jsp_jsp+servlet+javabean+jdbc实现增删改查和分页功能 案例源码
  3. 【JavaScript】关于eval( )
  4. IntelliJ IDEA 修改单行注释的格式
  5. sass 基础——回顾
  6. 编写react组件_s! 这就是为什么ReasonReact是编写React的最佳方法的原因
  7. python使用rabbitmq阻塞_python – Celery/RabbitMQ unacked消息阻塞队列?
  8. PHP按上下级层次关系输出内容
  9. 用scikit-learn和pandas学习线性回归,XGboost算法实例,用MSE评估模型
  10. 弘辽科技:新手拼多多店铺该怎么引流
  11. candence测量尺寸
  12. 火箭双杀尼克斯 哈林组合和砍50分
  13. 安卓调用系统相机拍照并且显示在ImageView上
  14. Ae 入门系列之五:效果和预设
  15. springboot+elasticsearch+bboss框架集成遇到的坑
  16. 物联网的概念、分层及关键技术
  17. Java-SSM流浪宠物管理系统
  18. NOI 模拟试题(一)
  19. Unity3D游戏开发初探—2.初步了解3D模型基础
  20. Prometheus 服务发现

热门文章

  1. 异军突起的链游Cryptoblades
  2. 下载单词英语单词_单词如何塑造体验
  3. 计算机开机跳过硬盘检查,怎么跳过开机硬盘自检的三个方法
  4. java-求指定数组中指定个数的排列组合
  5. 拼图软件那个好用?好用的拼图软件分享
  6. 果快服务器维护中 稍后再试,维护中什么意思?服务维护中是什么意思
  7. 7天吸粉111万,条条视频都爆款,无穷小亮的科普日常是如何做到的?!
  8. js正则:提取css语法中的背景图片名字
  9. 腾讯云物联网-网关设备体验
  10. 整合flink-cdc实现实时读postgrasql