PTA 7-8 卡片邻居游戏 (50 分) Java作业
2021-05-19
可以说是我做过比较神奇的题了。
原题
有个游戏叫卡片邻居游戏,它使用多张正方形的卡片,每张卡片在上下左右四边上有数字,可以顺时针旋转,如下图所示。
卡片在游戏板上被放成一排,相邻两张卡片的邻边应当具有相同的数字,不断有新的卡片需要放置到游戏板上,放置的位置应当满足相临边数字相同的要求(亦可放在头部和尾部)。下图展示了游戏板上的一组卡片排列和新增一张卡片后的游戏板
完成类NumberCard,包含构造函数和方法 rotate 和 getLeft,getRight,分别表示顺时针旋转卡片,返回左侧数字,返回右侧数字
完成类CardGame表示游戏版,包含方法int getIndexForFit(NameCard),boolean insertCard(NameCard),print() 其中getIndexForFit返回用最少的旋转数能将卡片插入到游戏板中的最靠前的位置,头部位置为0. insertCard将卡片通过最少的旋转插入到游戏板,按旋转完成的方向插入getIndexForFit返回的位置,返回插入成功与否。print函数按顺序输出每个卡片,每个卡片按照上右下左的顺序输出各个边上的数字。(注:应当选择适当的结构存储游戏板中的卡片)
输入格式:
插入新的卡片的个数 每个新插入的新卡片,按上右下左顺序
输出格式:
依次输出游戏板上各个卡片,按上右下左的顺序
输入样例:
在这里给出一组输入。例如:
3 1 2 3 4 6 4 3 3 4 3 7 4
输出样例:
在这里给出相应的输出。例如:
4 3 7 4 6 4 3 3 1 2 3 4
题解
其实最让我奇怪的是两个最:用最少的旋转数能将卡片插入到游戏板中的最靠前的位置,那么总归有一个优先次序吧;次奇怪的点是 insertCard 具有 boolean 类型的返回值,难不成有些不能插入成功?
有这两个疑问,我一直没想出来比较好的解决办法,直到有一个人做出来了,他的博客在这里。里面有一段话:
最后一个测试点有问题,最后一个数据没插入,应该是可以的,而且这个测试点的数据还不能旋转(我的函数都写错了,这么看好像所有的测试点都不用旋转/捂脸),然后就卡bug过了…
这解决了我的疑问:压根不旋转,如果没有位置可以插入,就舍弃而不插入。
所以这个题想表明什么XD,我觉得可能题目本意就是这样,但是题面写错了。毕竟Java作业,而不是算法。
最后附上我的AC代码:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); NumberCard nc = new NumberCard(sc); CardGame cg = new CardGame(sc); int num = cg.getNum(); for (int i = 0 ; i < num; i++) { nc.scan(); cg.insertCard(nc); } cg.print(); sc.close(); } } class NumberCard { private int up, down, left, right; private Scanner sc; public NumberCard() {} public NumberCard(Scanner _sc) { sc = _sc; } public void set(NumberCard c) { up = c.up; down = c.down; left = c.left; right = c.right; } public void rotate() { int tmp = up; up = left; left = down; down = right; right = tmp; } public int getLeft() { return left; } public int getRight() { return right; } public int getUp() { return up; } public int getDown() { return down; } public void print() { System.out.printf("%d %d %d %d", up, right, down, left); } public void scan() { up = sc.nextInt(); right = sc.nextInt(); down = sc.nextInt(); left = sc.nextInt(); } } class CardGame { private int num; private NumberCard[] cards; private Scanner sc; private int pos; public CardGame(Scanner _sc) { sc = _sc; num = sc.nextInt(); cards = new NumberCard[num]; pos = -1; } public int getIndexForFit(NumberCard c) { if (pos == -1) return 0; if (c.getRight() == cards[0].getLeft()) return 0; int _pos; for (_pos = 1 ; _pos <= pos; _pos++) { if (c.getLeft() == cards[_pos - 1].getRight() && c.getRight() == cards[_pos].getLeft()) break; } if (_pos > pos && c.getLeft() != cards[pos].getRight()) return -1; return _pos; } public boolean insertCard(NumberCard c) { int _pos = getIndexForFit(c); if (_pos == -1) return false; pos++; cards[pos] = new NumberCard(); for (int i = pos; i > _pos; i--) { cards[i].set(cards[i-1]); } cards[_pos].set(c); return true; } public int getNum() { return num; } public void print() { for (int i = 0; i <= pos; i++) { if (i > 0) System.out.print(" "); cards[i].print(); } } }
by SDUST weilinfox
- 作业——java编写一个简单的移动方块游戏
- java简易扑克牌游戏,慕课第三季作业
- Java 第二次作业PTA
- JAVA课程作业1--骰子游戏
- java基础作业之猜数字游戏;
- Java实现 LeetCode 822 翻转卡片游戏(暴力)
- Java第十二次作业:什么是一维数组?什么是对象数组?吃金币游戏2.0版 新增炸弹功能 新增游戏倒计时功能 新增胜利失败检测功能 使用如鹏游戏引擎制作窗体 一维数组设置金币
- 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法
- 多态部分作业 1.按要求编写Java程序:(1)编写一个接口:InterfaceA,只含有一个方法int method(int n);
- IT十八掌作业_java基础第十二天_集合
- 游戏中C++调用Java
- Java线程面试题Top50
- 游戏建模控件Aspose.3D for Java最新版支持在Wavefront OBJ中添加点云支持
- IT十八掌作业_java基础第十六天_GUI/socket
- 《开源合辑-(游戏/娱乐->角色扮演)之(Java)》
- java实现蛇和梯子的游戏(单一玩家和多玩家)
- Java语言实现的扫雷游戏(一)
- java作业调度、定时任务实践(三种实现方式)
- 使用Myeclipse内置Ant编译项目时提醒警告java\lang\Object.class(java\lang:Object.class): 主版本 51 比 50 新,此编译器支持最新的主版本
- 吉软_java57_第七次作业