假设这里有36张扑克牌,分别为A1~A9,B1~B9,C1~C9,D1~D9,其中A代表方片,B代表草花,C代表红桃,D代表黑桃,那么,设定如下的排序规则:
1.对于两张卡牌,X1Y1与X2Y2,X1与X2表示A~D,Y1与Y2表示1~9,如果X1与X2不同,那么依照D>C>B>A的方式进行排序
2.假如有X1与X2相同时,那么就比较Y1与Y2的大小。
例如,对于如下的四张牌,有如下的升序排序结果:
D3,C4,A4,C1
升序排序的结果为A4,C1,C4,D3
有人提出了如下的排序策略:
先建立9个队列,用于存放点数的大小,将卡牌依点数存放入各自的队列之中,然后再按队列1到队列9依次出队。
例如,对于上面的结果,依次进队后,结果如下:
队列1:C1;队列3:D3,队列4:C4,A4
将其依次出队后,结果为C1,D3,C4,A4
然后,再建立4个队列,用于存放花色。将卡牌依花色A~D存放入队列1~4中,然后再按队列1到队列4依次出队。
例如,对于上面刚刚出队的序列C1,D3,C4,A4,将其依次进队,结果如下:
队列1:A4;队列3:C1,C4;队列4:D3
将其依次出队后,结果为A4,C1,C4,D3,排序结束。
请根据上面的算法,编写一个用队列对扑克牌排序的程序,要求依照上面的排序规则,根据先花色后点数的方法进行排序。
第二行用XY的形式表示每一张牌,其中X为A~D,Y为1~9
第一个部分为第一次进队出队的结果,用Queue1:...表示,共9行,结果用空格分隔,下同
第二部分为第二次进队出队的结果,用QueueA:...表示,共4行
第三部分为一行,即将卡牌排序后的结果(升序排序)
8 D8 A6 C3 B8 C5 A1 B5 D3
Queue1:A1 Queue2: Queue3:C3 D3 Queue4: Queue5:C5 B5 Queue6:A6 Queue7: Queue8:D8 B8 Queue9: QueueA:A1 A6 QueueB:B5 B8 QueueC:C3 C5 QueueD:D3 D8 A1 A6 B5 B8 C3 C5 D3 D8
package dsa; import java.util.Scanner; /** * * @author tanlvxu * */ public class Demo17 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new Demo17().test() ; } public void test() { Queue qe[] = new Queue[13] ; Scanner sc = new Scanner(System.in) ; int n = sc.nextInt() ; int i,t ; String str[] = new String[n] ; for(i=0;i<13;i++) qe[i] = new Queue() ; for( i=0;i<n;i++) { str[i] = sc.next() ; } for(i=0;i<n;i++) { t = str[i].charAt(1) - '1' ; // System.out.println(t) ; qe[t].add(str[i]) ; } for(i=0;i<9;i++) { int t1 = qe[i].getLength() ; System.out.print("Queue"+(i+1)+":"); for(int j=0;j<t1;j++) System.out.print(qe[i].query(j)+" ") ; System.out.println() ; } swap(str) ; for(i=0;i<n;i++) { t = str[i].charAt(0) - 'A' +9; qe[t].add(str[i]) ; } // for( i=0;i<n;i++) // { // System.out.println(str[i]) ; // } char c = 'A' ; for(i=9;i<13;i++) { int t1 = qe[i].getLength() ; System.out.print("Queue"+c+":"); for(int j=0;j<t1;j++) System.out.print(qe[i].query(j)+" ") ; System.out.println() ; c = (char)((int)c+1) ; } for(i=9;i<13;i++) { int t1 = qe[i].getLength() ; for(int j=0;j<t1;j++) System.out.print(qe[i].query(j)+" ") ; } System.out.println(); } /** * 交换方法 * @param str */ public void swap(String str[]) { int i,j ; for(i=0;i<str.length-1;i++) for(j=i+1;j<str.length;j++) { if(str[i].charAt(0)-str[j].charAt(0)>0) { String s = str[j] ; str[j] = str[i] ; str[i] = s ; }else if(str[i].charAt(0)-str[j].charAt(0)==0&&str[i].charAt(1)-str[j].charAt(1)>0) { String s = str[j] ; str[j] = str[i] ; str[i] = s ; } } } /** * 数组实现队列 * @author tanlvxu * */ class Queue { String a[] = new String[0] ; //数组 int index = 0 ; //标记第一个空余位置 /** * 增加一个元素 */ public void add(String i){ //新建一个数组,长度是原数组长度+1; String b[] = new String[a.length+1] ; //将要加入的对象放入新数组的最后一位置 b[a.length] = i ; //将原数组中的东西放到新数组中; for(int j=0;j<a.length;j++){ b[j] = a[j] ; } //指向新建的数组 a = b ; index ++ ; } /** * 指定位置,删除一个元素 */ public void del(int i){ if( i<0 || i>a.length){ throw new IllegalArgumentException("下标越界:"+index+",size:"+a.length) ; } String b[] = new String[a.length-1] ; for(int j=0;j<a.length-1;j++){ if(j>=i){ b[j]=a[j+1]; }else{ b[j] = a[j] ; } } a =b ; index -- ; } /** * 查找 */ public String query(int i){ String b = a[i]; return b ; // System.out.print("你查找的元素为:"+ b); } /** * 得到队列的长度 */ public int getLength() { return index ; } } }
#include<iostream> #include<cstring> using namespace std; char cp[101][3] ; int n ; void swap() { for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) { if(cp[i][0]>cp[j][0]) { char c[3] ; strcpy(c,cp[i]); strcpy(cp[i],cp[j]); strcpy(cp[j],c); }else if(cp[i][0]==cp[j][0]&&cp[i][1]>cp[j][1]) { char c[3] ; strcpy(c,cp[i]); strcpy(cp[i],cp[j]); strcpy(cp[j],c); } } } class Queue{ int index ; public : Queue(); ~Queue(); char ch[101][3] ; void add(char c[3]) ; int getLength(); }; Queue::Queue() { index = 0; } Queue::~Queue(){}; void Queue::add(char c[3]) { strcpy(ch[index],c) ; index ++ ; } int Queue::getLength() { return index ; } int main() { int i,t ; cin>>n ; for(i=0;i<n;i++) { cin>>cp[i]; } Queue qe[13] ; for(i=0;i<n;i++) { t = cp[i][1] -'1' ; qe[t].add(cp[i]) ; } for(i=0;i<9;i++) { cout<<"Queue"<<(i+1)<<":" ; t = qe[i].getLength() ; for(int j=0;j<t;j++) cout<<qe[i].ch[j]<<" " ; cout<<endl ; } swap(); for(i=0;i<n;i++) { t = cp[i][0] -'A'+9 ; qe[t].add(cp[i]) ; } char c = 'A' ; for(i=9;i<13;i++) { cout<<"Queue"<<c<<":" ; t = qe[i].getLength() ; for(int j=0;j<t;j++) cout<<qe[i].ch[j]<<" " ; cout<<endl ; c = (char)((int)c +1) ; } for(i=0;i<n;i++) cout<<cp[i]<<" " ; cout<<endl ; }
相关推荐
2. 用队列对扑克牌排序 [问题描述] 假设有36张扑克牌,分别为A1~A9,B1~B9,C1~C9,D1~D9,其中A代表方片,B代表草花,C代表红桃,D代表黑桃,那么,设定如下的排序规则: 1.对于两张卡牌,X1Y1与X2Y2,X1与X2表示A~D...
另外,堆(优先队列)可以用于模拟扑克牌的发牌,保证每次取出的都是最大或最小的牌。 三、洗牌算法 洗牌是将扑克牌打乱顺序的过程。经典的洗牌算法是Fisher-Yates(也称为Knuth)洗牌算法,它保证了每种排列出现的...
2. **C++面向对象编程**:源码中会展示如何定义和使用类来表示扑克牌、玩家、牌堆等概念。面向对象编程的核心思想如封装、继承和多态在扑克牌游戏中都会有所体现。 3. **事件驱动编程**:扑克牌游戏的界面会响应...
本项目选择了两个经典实例:手机通讯录模拟和24点扑克牌游戏,这两个主题都是很好的数据结构应用场景,能充分展示链表、树、排序等基本数据结构的运用。 首先,让我们关注手机通讯录模拟。通讯录是一个存储联系人...
在本项目中,我们讨论的是一个使用Java编程语言实现的扑克牌游戏,特别是蜘蛛纸牌。这个项目结合了计算机图形学的知识,使游戏界面更加生动和互动。下面将详细阐述涉及的技术点和知识点。 首先,Java是编程的核心...
在编程练习中,可以用这些图片作为测试数据,开发扑克牌排序算法。在数据分析项目中,可以分析不同花色和数字出现的频率。 在实际应用中,处理这些图片时,开发者可能需要掌握以下IT知识点: 1. 图像处理库:如...
插入排序是一种简单直观的排序算法,它的工作原理类似于人们整理扑克牌。对于一个未排序的序列,插入排序会遍历每个元素,将其与已排序的部分进行比较,然后插入到正确的位置。插入排序在处理小规模或部分有序的数据...
本项目是用C#编程语言实现的拱猪扑克牌游戏源代码,对于想要学习C#游戏编程的初学者来说,这是一个非常实用的学习资源。下面将详细探讨这个项目中涉及的C#和游戏编程相关知识。 首先,C#是一种面向对象的编程语言,...
- **定义**:插入排序是一种简单直观的排序算法,其工作原理类似于人们在打扑克牌时整理手里的牌的过程。 - **基本思想**: - 从第一个元素开始,该元素可以认为已经被排序; - 取出下一个元素,在已经排序的元素...
插入排序是将每个元素插入到已排序好的序列中的适当位置,类似于打扑克牌时整理手牌的过程。插入排序在处理小规模数据或近乎有序的数据时表现出色,但在大规模无序数据上效率较低。 归并排序是分治法的典型应用,它...
1. 插入排序:插入排序是一种简单的排序算法,它的工作原理类似于打扑克牌。已排序的部分保持不变,未排序的元素逐个插入到已排序部分的正确位置。在C++中,可以使用两层循环实现,外层循环控制未排序部分,内层循环...
5. **数据结构与算法**:扑克牌的存储和操作可能涉及到数组、列表、栈或队列等数据结构,以及排序、比较等算法。理解并优化这些数据结构和算法可以提高游戏的性能。 6. **事件监听与回调**:在Android中,用户操作...
插入排序的工作原理类似于整理扑克牌,每张新牌插入到已排序好的序列的正确位置。Java实现插入排序时,会使用一个for循环和一个while循环,将未排序的元素逐个插入到已排序的部分。 4. 快速排序(Quick Sort) 快速...
直接插入排序是一种简单的排序算法,它的工作原理类似于打扑克牌。每次将一个待排序的元素插入到已经排好序的序列中的正确位置。这个过程通过一个while循环来实现,比较当前元素与前面已排序的元素,直到找到合适的...
3. 插入排序:插入排序的工作原理类似于整理扑克牌,将未排序的元素依次插入到已排序部分的正确位置。在最好情况(已排序数组)下,时间复杂度为O(n),但在最坏情况下,它仍然是O(n^2)。 4. 快速排序:由C.A.R. ...
- 直接插入排序:类似于玩扑克牌,每次取一张未排序的牌并找到合适的位置插入已排序的牌堆中。直接插入排序.c文件将实现这一逻辑。 4. **括号匹配**:这是字符串处理中的一个常见问题,用于检查一个字符串中的括号...
插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌。对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以通过两层循环来实现,外层循环控制未排序部分,内层循环则找到...
它的工作原理类似于人们手动排序一副扑克牌,将每个元素插入到已排序部分的正确位置。时间复杂度在最好和最坏情况下分别为O(n)和O(n^2)。 4. **希尔排序**:插入排序的优化版本,通过增加元素间的跨度来减少比较和...
2. **插入排序**:插入排序的工作原理类似于我们手动整理扑克牌的过程。它遍历数组,将每个元素插入到已排序部分的正确位置。插入排序在处理小规模或部分有序的数据时效率较高。 3. **选择排序**:选择排序每次迭代...
例如,可以使用数组或链表存储牌组,用栈来处理玩家的手牌,用队列来模拟洗牌过程,甚至可能用哈希表来快速查找特定的牌。 2. **类与对象**:面向对象编程是实现游戏逻辑的理想选择。我们可以创建`Card`类来表示每...