抽纸牌,任意张牌,1拿一张到牌底,2拿一张放到桌面,重复1,2操作,直到手中没牌,最后桌子上的牌是从1到n有序,求出牌排放顺序。...

博客围绕抽纸牌问题展开,规则是对任意张牌,先拿一张到牌底,再拿一张放到桌面,重复操作至手中没牌,使桌上牌从1到n有序,需求出牌初始排放顺序,还提及是很久以前代码留存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽纸牌,任意张牌,1拿一张到牌底,2拿一张放到桌面,重复1,2操作,直到手中没牌,最后桌子上的牌是从1到n有序,求出牌排放顺序。

抽纸牌,任意张牌,1拿一张到牌底,2拿一张放到桌面,重复1,2操作,直到手中没牌,最后桌子上的牌是从1到n有序,求出牌排放顺序。

很久以前的代码,电脑清理,留存

package linkedlist;

import java.util.ArrayList;
import java.util.LinkedList;
/**
 * 抽纸牌,任意张牌,1拿一张到牌底,2拿一张放到桌面,,重复1,2操作,使桌面的牌形成12345~顺序排列,求出牌排放顺序
 * @author https://github.com/famine-life
 * 
 * 本程序假设5张
 *
 */
public class test {

    public static void main(String[] args) {
        //ArrayList list0 = new ArrayList();
        LinkedList<Integer> list0 = new LinkedList<Integer>();  //要求出的数列
        LinkedList<Integer> list1 = new LinkedList<Integer>();  //设置list1为:12345
        LinkedList<Integer> list2 = new LinkedList<Integer>();  //12345执行游戏规则后的数列
        LinkedList<Integer> list_test = new LinkedList<Integer>();  //用于验证的
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        list1.add(5);
        
        System.out.println("初始list1:"+list1);
        System.out.println("=========");
        System.out.println("执行游戏规则后:");
        for(int i=0;list2.size()<5;i++)
        {
            list1.add(list1.removeFirst());     
            list2.add(list1.getFirst());        
            list1.removeFirst();                
        }
        

        System.out.println("list1:"+list1);
        System.out.println("list2:"+list2);     //2, 4, 1, 5, 3
        System.out.println("==================");
        
        System.out.println("发现list2的值作为list1的下标,他们的值就会相等:(下标从1开始)");
        
        list1.add(1); //从新初始化list1
        list1.add(2);
        list1.add(3);
        list1.add(4);
        list1.add(5);
        for(int j=0;j<list2.size();j++)
            System.out.print(list1.get(list2.get(j)-1));  //-1是因为防止数组溢出
        
        System.out.println();
        System.out.println("==================");
        System.out.println("那么list0应该是这样求:");
        
        list0.add(0); //初始化list0
        list0.add(0);
        list0.add(0);
        list0.add(0);
        list0.add(0);
        
        for(int k=0;k<list2.size();k++)
        {   
            //-1是因为防止数组溢出
            list0.set(list2.get(k)-1,list1.get(k));     //set(index,element)
        }
        System.out.println("输出list0:");
        System.out.println(list0);
        
        
        //遍历出List0
//      for(int x=0;x<list0.size(); x++)
//          System.out.println(x+","+list0.get(x));
        
        System.out.println("==================");
        System.out.println("验证:");
        System.out.println("用List0执行游戏规则:");
        
        for(int m=0;list_test.size()<5;m++)
        {
            list0.add(list0.removeFirst());     //list1.addLast(list1.removeLast());
            list_test.add(list0.getFirst());        //list0.addLast(list1.getLast());
            list0.removeFirst();                //list1.removeLast();
        }
        System.out.println("验证输出:"+list_test);
    }
    

}

输出

初始list1:[1, 2, 3, 4, 5]
=========
执行游戏规则后:
list1:[]
list2:[2, 4, 1, 5, 3]
==================
发现list2的值作为list1的下标,他们的值就会相等:(下标从1开始)
24153
==================
那么list0应该是这样求:
输出list0:
[3, 1, 5, 2, 4]
==================
验证:
用List0执行游戏规则:
验证输出:[1, 2, 3, 4, 5]
posted @ 2019-03-22 13:48 练涛 阅读( ...) 评论( ...) 编辑 收藏
任务描述 本关任务:给定任意给甲、乙,设计一个程序判定“纸牌游戏-钓鱼”的胜者。 相关知识 游戏规则:将一副扑克去掉花10,只留下1~9的,即扑克只有0-9之间的数字,平均分成二份,每人拿一份,不妨设为甲、乙二人,甲先拿出手中的第一张扑克放在桌上,然后乙也拿出手中的第一张扑克,并放在刚打出的扑克的上面。出时,如果谁打出的与桌上某面相同,可将二及中间所夹的全部取走,并依次放到手中的末尾,然后继续出直到打出的与桌上的都不相同,就这样两人交替出。当一人手中可出时,游戏结束,对手获胜。 先来分析游戏中的几种操作,分别是出和赢,每个人的手可以设置成队列结构,这恰好对应队列的两个操作,出就是出队,赢就是入队。桌子可设置成一个栈的结构,每打出一张放到桌上就相当于入栈。当有人赢的时候,依次将从桌上拿走,这就相当于出栈。如果某人打出的桌子上的某相同,即可将两以及中间所夹的全部取走,即全部出栈,并且加入此人的队列。当一个人手中先出完时,游戏结束,对方获胜。 本实训任务使用顺序栈和循环队列,顺序栈的头文件为sqstack.h,实现文件为sqstack.cpp,顺序队列的头文件为sqqueue.h,实现文件为sqqueue.cpp。 根据游戏的规则,定义二个队列,一个栈,二个队列交替出队,一个队列出队时,首先要在栈中查找是否有元素和此队列出队的元素相同,在顺序栈中查找是否有某时,可以参考 顺序表按照值查找序号操作算法 当一个队列出队时,若出队的元素和栈中的某个元素k相同,则赢,出队的元素进入自己的队列,再将栈中的元素挨个出栈直到k,每出栈一个,就插入赢队列,赢队列在将栈中拿完以后,必须继续出,当栈中有与出队元素相同的时,轮到另一个队列出。当某队列为空时,游戏结束,非空队列代表者获胜。 int LocateElem_Sq(SqStack L, SElemType e, int (*compare)(SElemType, SElemType)) { // 在顺序栈L中查找第1个值与e满足compare()的元素的位序。 // 若找到,则返回其在L中的位序,否则返回0。 int i; SElemType *p; i = 0; // i的初值为第1个元素的位序 p = L.base; // p的初值为第1个元素的存储位置 int length = L.top-L.base; while (i <length && !(*compare)(*p++, e)) ++i; if (i < length) return i; else return -1; } 编程要求 根据提示,在右侧编辑器补充代码,要注意的是出时,如果谁打出的与桌上某面相同,将二及中间所夹的全部取走后,应该继续出直到打出的与桌上的都不相同。 测试说明 平台会对你编写的代码进行测试: 测试输入: 2 4 1 2 5 6 3 1 3 5 6 4 预期输出: 甲:4,1,2,5,6, 乙:1,3,5,6,4, 栈:2,3, 甲:1,2,5,6, 乙:3,5,6,4, 栈:2,3,4,1, 甲:6,1,1,2,4,3,2, 乙:5,6,4, 栈:5,3, 甲:1,2,4,3,2, 乙:4,5,6,3,5, 栈:6,1, 甲:2,4,3,2,1,4,1, 乙:5,6,3,5, 栈:6, 甲:4,3,2,1,4,1, 乙:6,3,5, 栈:6,2,5, 甲:2,1,4,1,3,3, 乙:5,6,4,5,2,6, 栈: 甲:1,4,1,3,3, 乙:6,4,5,2,6, 栈:2,5, 甲:4,1,3,3, 乙:4,5,2,6, 栈:2,5,1,6, 甲:3,3, 乙:4,4,5,6,1,5,2,2, 栈:6,1, 甲:3, 乙:4,5,6,1,5,2,2, 栈:6,1,4,3, 甲: 乙:6,1,5,2,2,4,3,4, 栈:6,1,5,3, 甲: 乙:6,1,5,2,2,4,3,4, 栈:6,1,5,3, 乙获胜 输入说明 第一行输入甲手中的6; 第二行输入乙手中的6。 输出说明 甲先出,如果发现桌面上有跟刚才打出的的数字相同的,则把从相同的那开始的全部按次序放在自己手里的的末尾,再继续出,当桌面有跟刚才打出的的数字相同的时,分三行输出甲手里的,乙手里的,桌上的;同理,轮到乙出后,分三行输出甲手里的,乙手里的,桌上的直到有一方获胜。 开始你的任务吧,祝你成功!
最新发布
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生莫如饥荒

如果对您有帮助,也可以给点赏钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值