- 浏览: 309279 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
js调用excel、word打印 -
jyangzi5:
[u][/u]引用
常见hibernate面试题 -
wangv:
<code="java">Sy ...
常见hibernate面试题 -
bardo:
建议看看这一个
http://bardo.iteye.com ...
金额数字转中文大写 -
dotjar:
在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用 ...
常见hibernate面试题
记得小时候看到别人玩的一个游戏,给他一定个数有大小次序的扑克牌,指定每次置底的个数,经过他调整次序后,可以先置底再出一张牌,依此类推,直到扑克牌全部出来,可以实现从大到小或者从小到大一个个出来,是怎么出来的呢?当时觉得很神奇,长大后经过思考和查阅知道了方法,并用几种算法实现了!
以下是用java实现的程序:
A,2,3,4,5..J,Q,K,13张扑克牌,从上面拿一张放在最下面(重复n次,默认n=1),再从上面拿一张出来显示,重复此操作,要求出来的顺序是:A,2,3,4,5..J,Q,K
要求的是给出定义规则后初始的扑克牌顺序!
以下是用java实现的程序:
/** * 功能说明:扑克牌游戏,先出一张牌后置一张牌到底部,依次类推 * 使其按1 2 3 4顺序出列 * 采用逆推法和改错法 */ package com.mcfeng.base; /** * @author microjava * * 2008-12-29上午12:46:15 * */ public class Pukepai { private final static int PAI_NUM = 13; /** * @param args */ public static void main(String[] args) { // 测试 // System.out.println(adNum(13)); // 排序第一个参数为牌的个数,第二个参数为置底个数(目前只支持1)第三个参数0代表先出牌1代表先置底 sort(13, 1, 0); //逆推法 sortByNitui(13,3,true); //唐粒子的方法 /*int num = 3; while(num++ < 1000) { sort(num, 1, 0); sortByTang(num); } */ } /** * 得出 n + n/2 + n/4 + ... + 1 的和 有小数的补整 */ public static int adNum(int n) { int m = 0; for (int i = n; i > 0;) { // System.out.println(i); m += i; if (i == 1) break; if (i % 2 == 0) i = i / 2; else i = (i / 2) + 1; } return m; } /** * 改错法 * 扑克牌排序,三个参数的意思分别为: paiNum牌个数 hNum每次置地步牌的个数 l出牌或置底顺序(0为先出牌,1为先置底) */ public static int[] sort(int paiNum, int hNum, int l) { if(paiNum <= 1) { int [] res = {1}; return res; } int total = adNum(paiNum); int[] a = new int[total]; // 初始的加长数组 可以存放置底的牌 长度由 n + n/2 + // n/4 + ... + 1得出 int[] b = new int[paiNum]; // 逆推序列数组 int[] c = new int[paiNum]; // 正确顺序数组 //初始化数组 for (int i = 0; i < paiNum; i++) { a[i] = i + 1; } //按照规则排序 int st = 0; //定义起点 int bj = 0; //逆推序列数组标号 int aj = paiNum; //加长存放起始标号 while(true) { b[bj++] = a[st++]; if(a[st + 1] == 0) { b[bj] = a[st]; break; } a[aj++] = a[st++]; } //由逆推序列得出正确序列 for (int i = 0; i < b.length; i++) { c[b[i] - 1] = i + 1; } System.out.println("改错法排出的序列"); for (int i : c) { System.out.print(i + " "); } return c; } /** * 逆推法 * 扑克牌排序,三个参数的意思分别为: paiNum牌个数 * hNum每次置地步牌的个数 flag出牌或置底顺序(true为先出牌,false为先置底) * */ public static int[] sortByNitui(int paiNum,int hNum,boolean flag) { int[] a = new int[paiNum]; //初始数组 int[] b = new int[paiNum]; //正确数组 //初始化序列 for (int i=0;i<paiNum;i++) { a[i] = paiNum - i; } int ed = paiNum - 1,st = 0; //逆推排序 一张牌置底的时候 /*while(ed >= 0) { b[ed] = a[st]; if(ed == 0 && l == 0) break; if(ed < paiNum - 1) { int temp =b[paiNum - 1]; for(int i = paiNum - 2;i >= ed;i--) { b[i + 1] = b[i]; } b[ed] = temp; } st++; ed--; }*/ //逆推排序 两张牌置底的时候 int[] temp = new int[hNum]; while(ed >= 0) { b[ed] = a[st]; if(ed == 0 && flag) break; if(ed >= paiNum - hNum && ed < paiNum -1 && hNum > 2) { int temphNum = hNum%(st + 1); for(int i = 0;i< temphNum; i++) { temp[i] = b[paiNum - i -1]; } for(int i = paiNum - 1 - temphNum;i >= ed;i--) { b[i + temphNum] = b[i]; } for(int i =0;i<temphNum;i++) { b[ed + i] = temp[temphNum - i - 1]; } } else if(ed < paiNum - hNum) { for(int i = 0;i< hNum; i++) { temp[i] = b[paiNum - i -1]; } for(int i = paiNum - 1 - hNum;i >= ed;i--) { b[i + hNum] = b[i]; } for(int i =0;i<hNum;i++) { b[ed + i] = temp[hNum - i - 1]; } } st++; ed--; } /*System.out.println("\n逆推法排出的序列:"); for (int i : b) { System.out.print(i + " "); }*/ return b; } /** * 唐粒子的方法 */ public static void sortByTang(int num) { int sum, j = 0, k = num; int head = 0, tail = 0; System.out.println(); sum = adNum(k); System.out.println(sum); head = 0; tail = k; int[] init = new int[sum]; System.out.println("init:" + sum); //初始化 for (int i = 0; i < k; i++) init[i] = i + 1; for (int i = 0; i < k; i++) { System.out.print(init[i]); System.out.print(" "); } int[] a = new int[k + 1]; while (head != tail) { a[j++] = init[head]; if (head + 1 == tail) { //a[j] = init[tail]; break; } init[tail++] = init[head + 1]; head += 2; } System.out.println(); System.out.println("after del:"); for (int i = 0; i < j; i++) { System.out.print(a[i]); System.out.print(" "); } int[] out = new int[k]; for (int i = 0; i < k; i++) out[a[i] - 1] = i + 1; System.out.println(); System.out.println("result:"); for (int i = 0; i < k; i++) { System.out.print(out[i]); System.out.print(" "); } } }
评论
2 楼
microjava
2009-11-04
junlas 写道
不明白这个游戏是什么意思?楼主能再解释的详细点吗。。
A,2,3,4,5..J,Q,K,13张扑克牌,从上面拿一张放在最下面(重复n次,默认n=1),再从上面拿一张出来显示,重复此操作,要求出来的顺序是:A,2,3,4,5..J,Q,K
要求的是给出定义规则后初始的扑克牌顺序!
1 楼
junlas
2009-11-04
不明白这个游戏是什么意思?楼主能再解释的详细点吗。。
发表评论
-
JSP禁用缓存常用方法
2013-10-24 09:14 796JSP禁用缓存常用方法 jsp页面禁止缓存设置 1.客户端 ... -
Java操作excel的综合应用(jxl)
2011-04-19 10:28 2130根据excel模板生成excel报表文件--用于报表打印 j ... -
抽象工厂模式
2011-03-18 15:16 969抽象工厂模式中的有以 ... -
单实例Singleton设计模式
2011-03-10 10:29 1099单实例Singleton设计模式 ... -
JAVA获取服务器路径
2010-09-28 20:36 3564获取服务器路径 在JSF环境中获取到ServletConte ... -
模拟随机发牌
2010-08-17 19:47 1281public void testinit(){ ... -
java web 标签.CHM
2010-08-17 19:26 823Struts2、Struts1、jstl、jsf、spring ... -
java反编译器
2010-08-11 17:38 978java反编译器 -
金额数字转中文大写
2010-08-07 13:31 1368金额数字转中文大写 处理能力: 整数部分:99999999 ... -
获取指定路径下的所有文件
2010-07-23 16:24 1109package test; import java. ... -
已知最大值的高效排序算法
2010-06-10 10:54 1063有一组数据3,5,9,7,4,13,15,0,2,20.已知最 ... -
错误页面跳转解决办法
2010-06-09 15:50 1301错误页面跳转解决办法 在web.xml中配置错误页面跳转如下 ... -
web系统图标资源
2009-12-21 16:04 1252http://open-open.com/ajax/ajax2 ... -
Think in java3(中文完整版)
2009-12-17 23:09 1070Think in java3(中文完整版) -
用jar命令将Web应用打包成war文件的简单方法
2009-12-17 17:16 1270假定有一个Web应用:C:\myHome myHome/WE ... -
JAVA编程思想
2009-12-15 14:14 762JAVA编程思想 -
Java调用dll实现des加密解密
2009-12-10 16:42 3108package com.srcb.common; p ... -
Java开发--常用网站
2009-11-12 11:13 8221.jar查找: http://www.findjar.com ... -
指定目录输出日志(根据日期和操作员信息)
2009-11-09 14:24 1069package com.microjava.log; ... -
趣味题笔记
2009-10-29 19:29 945一个农夫养了一头牛, ...
相关推荐
在现代社会中,随着社会的快速发展,人们对休闲娱乐越来越重视,又由于电脑的快速发展,“21点”纸牌游戏逐渐成为人们的娱乐的一种方式,编写程序实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。...
java实现扑克牌游戏,思路及其清晰,十分适合初学者学习与应用。
一款C语言实现的扑克牌小游戏,用到了随机函数,初学者可以看一下,方便日后学习。游戏规则: 游戏开始时,向所有参与者(庄家和闲家)分发两张扑克牌。玩家可以看到他们的牌以及点数总和。然而,庄家有一张牌暂时不...
21点扑克牌游戏(C#源码)
java 扑克牌24点算法 输入4个数(1-10),可以得到用+-*/运算,结果为24的方法
* 玩家 * 扑克牌 * 创建一副扑克牌,不包含大小王 *定义扑克牌的属性(花色和点数)
C++扑克牌游戏源代码, 源代码的呈现,可以看出每一个执行的细节 可以在纯dos中运行中的游戏代码,精彩不容错过
[java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip [java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip [java] 西游记扑克牌游戏.zip[java] ...
扑克牌游戏编程的技巧、方法、源码等等,详细具体,程序清晰,运行良好,是很好的游戏开发教程
内含C++程序的所有源代码,以及设计好以后的扑克牌运行程序,所设计的
本文档为数据结构课程设计代码,使用编程语言java,包含题目:手机通通讯录模拟,24点扑克牌游戏
扑克发牌算法实现 首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: 红桃按照从小到大依次为:1-13 方块按照从小到大依次为:14-26 黑桃按照从小到大依次为:27-39 梅花按照从小到大依次为:40-52 ...
扑克牌游戏是一款受人喜欢的休闲游戏,大多数电脑上都装有这种游戏,很多人都玩过这种扑克牌游戏,都熟悉这种游戏的功能,我所做的这种扑克牌游戏开发理念是基于电脑自带的蜘蛛纸牌游戏,利用java语言实现了蜘蛛纸牌...
21点扑克牌游戏(雷雷开发 个人开发) 包你满意 亲情奉献 赶紧下载吧 欢迎下载我其它资源
拱猪扑克牌游戏使用.net c#开发,VS2017下编译通过,测试正常。
Java实现简单的扑克牌游戏,思路及其清晰,十分适合初学者学习与应用。有洗牌,发牌等基本功能,还可以玩捉鬼游戏,附带详细讲解。
适合开发扑克牌游戏
扑克牌升级游戏,设计新颖,算法严谨,娱乐性强
一个简单的扑克牌游戏,洗牌,生成牌,用C++写成的。