PTA卡片邻居游戏JAVA版——山东科技大学

有个游戏叫卡片邻居游戏,它使用多张正方形的卡片,每张卡片在上下左右四边上有数字,可以顺时针旋转,如下图所示。
在这里插入图片描述

卡片在游戏板上被放成一排,相邻两张卡片的邻边应当具有相同的数字,不断有新的卡片需要放置到游戏板上,放置的位置应当满足相临边数字相同的要求(亦可放在头部和尾部)。下图展示了游戏板上的一组卡片排列和新增一张卡片后的游戏板


完成类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;
        }

    }
}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值