博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
魔术师发牌问题
阅读量:6533 次
发布时间:2019-06-24

本文共 1309 字,大约阅读时间需要 4 分钟。

hot3.png

1、问题描述

    魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以次熬到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将牌堆最上面的哪张排数为1,把他翻过来正好是黑桃A,将黑桃A从牌堆抽出放在桌子上,第二次数1、2,将第一张放在牌堆最下面,第二张翻开,正好是黑桃2,也将它抽出放在桌子上。这样依次进行将13将牌全部翻出,准确无误。问牌最开始的顺序是怎样排的。

2、问题求解

   创建带有13个空间点的循环链表,模拟魔术师数数翻牌,第一次翻出的位置是黑桃A,,设置链表改位置节点值为1,第二次翻出的位置是黑桃2,,设置链表改位置节点值为2,依次类推,最终可得牌最开始的排列顺序。

package test.algorithm.FastSlowPointer;public class Magician {		public static void main(String[] args){		//创建并初始化有13个节点的链表, 0代表节点值为空		Node header = null;		Node pointer = header;		for(int i=1;i<=13;i++){			Node temp = new Magician.Node(0);			if(header==null){				header = temp;			}else{				pointer.next = temp;			}			pointer = temp;			pointer.next = header;		}		System.out.print("创建13个节点的空链表:");		printList(header);				//根据魔术师发牌逆推牌的开始顺序		pointer = header;		int countNum = 1 ;		while(true){			//按顺序查找揭牌位置			for(int i=1;i
13){ break; } } System.out.print("牌的开始顺序:"); printList(header); } static class Node { private int num; private Node next; public Node(int num){ this.num = num; } } /** * 打印链表 * @param node */ static void printList(Node header){ Node pointer = header; do{ System.out.print(pointer.num+" "); pointer = pointer.next; }while(pointer!=null && pointer!=header); System.out.println(); }}

转载于:https://my.oschina.net/u/140462/blog/277223

你可能感兴趣的文章
apache端口占用问题
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
几句话就能让你明白:网络地址转换(NAT)
查看>>
springboot项目自定义注解实现的多数据源切换
查看>>
特此说明
查看>>
使用flume替代原有的scribe服务
查看>>
用脚本来定制ESXI安装镜像
查看>>
微软企业级加解密解决方案MBAM架构
查看>>
没有苦劳,只有功劳!
查看>>
基于ThinkPHP写的一个简单的CMS系统
查看>>
Exchange 2010 DAG local and Site DR/Failover and Fail back
查看>>
LigerUI - 树表格的数据来自Server
查看>>
认证技术概述
查看>>
2016国赛小结
查看>>
Android Studio 第六十四期 - Android业务组件化之URL Scheme使用
查看>>
Hyper-V 2016 系列教程41 Windows 10 Hyper-V 系统要求
查看>>
EC2 WordPress 移动目录
查看>>
Windows Server 2008 启用公共文件夹共享
查看>>