有个游戏叫卡片邻居游戏,它使用多张正方形的卡片,每张卡片在上下左右四边上有数字,可以顺时针旋转,如下图所示。
卡片在游戏板上被放成一排,相邻两张卡片的邻边应当具有相同的数字,不断有新的卡片需要放置到游戏板上,放置的位置应当满足相临边数字相同的要求(亦可放在头部和尾部)。下图展示了游戏板上的一组卡片排列和新增一张卡片后的游戏板
完成类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
这个题其实没有这么简单,应该还需要考虑改变之前放的,但这个题的数据没有,我也不想写了,直接粘出来了,随便拿。
.
.
.
.
.
.
.
防查重,要复制的话最好改一改。
关于最后一个测试点,我也很懵逼,别人和我的答案一样,但就只有这个代码能过,实在不清楚怎么回事。
知道了,是我的旋转函数写错了,但是改正之后又过不了了,就不改了,先这样吧。
最后一个测试点有问题,最后一个数据没插入,应该是可以的,而且这个测试点的数据还不能旋转(我的函数都写错了,这么看好像所有的测试点都不用旋转/捂脸),然后就卡bug过了…
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n=input.nextInt();
int[] a=new int[4];
CardGame cardgame=new CardGame();
cardgame.card[0].nextmark=1;
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
a[j]=input.nextInt();
}
NumberCard c=new NumberCard(a);
c.mark=NumberCard.num++;
cardgame.insertCard(c);
}
cardgame.print();
}
}
class NumberCard {
public int[] number;
public int mark;
public int nextmark;
public int left, right;
public static int num = 2;
public NumberCard(int[] a) {
number = new int[4];
for (int i = 0; i < 4; i++) {
number[i] = a[i];
}
left = 0;
right = 0;
mark = 0;
nextmark = 0;
}
public NumberCard() {
number=new int[4];
left = 0;
right = 0;
mark = 0;
nextmark = 0;
}
public int getLeft() {
return number[3];
}
public int getRight() {
return number[1];
}
public void rotate() {
for (int i = 0; i < 4; i++) {
number[i] = number[(i - 1 + 4) % 4];
}
//下面是应该正确的写法
//int cnt=number[3];
//for (int i = 3; i >0; i--){
// number[i] = number[(i - 1 + 4) % 4];
//}
//number[0]=cnt;
}
}
class CardGame {
public NumberCard[] card;
public CardGame() {
card=new NumberCard[100];
for(int i=0;i<100;i++){
card[i]=new NumberCard();
}
card[0].nextmark = 1;
card[1].mark=1;
}
public int getIndexForFit(NumberCard c) {
for (int i = 0; i < 4; i++)// 旋转次数
{
for (int j = 0; j != 1;) {
boolean left = false, right = false;
NumberCard a = card[j], b = card[card[j].nextmark];
if (a.mark == 0 || a.number[1] == c.number[3])
left = true;
if (b.mark == 1 || b.number[3] == c.number[1])
right = true;
if (left==true && right==true) {
return j;
}
j = card[j].nextmark;
}
c.rotate();
}
return -1;
}
public boolean insertCard(NumberCard c) {
int x = getIndexForFit(c);
if (x == -1)
return false;
c.nextmark = card[x].nextmark;
card[x].nextmark = c.mark;
card[c.mark]=c;
return true;
}
public void print() {
int x = card[0].nextmark;
boolean flag=false;
while (x != 1) {
for (int i = 0; i < 4; i++) {
if(flag==true)
System.out.print(" "+card[x].number[i]);
else
System.out.print(card[x].number[i]);
flag=true;
}
x=card[x].nextmark;
}
}
}