`

用队列对扑克牌排序

 
阅读更多
总时间限制:
1000ms
内存限制:
65536kB
描述

假设这里有36张扑克牌,分别为A1~A9,B1~B9,C1~C9,D1~D9,其中A代表方片,B代表草花,C代表红桃,D代表黑桃,那么,设定如下的排序规则:

1.对于两张卡牌,X1Y1X2Y2X1X2表示ADY1Y2表示19,如果X1X2不同,那么依照D>C>B>A的方式进行排序

2.假如有X1X2相同时,那么就比较Y1Y2的大小。

例如,对于如下的四张牌,有如下的升序排序结果:

D3C4A4C1

升序排序的结果为A4C1C4D3

有人提出了如下的排序策略:

先建立9个队列,用于存放点数的大小,将卡牌依点数存放入各自的队列之中,然后再按队列1到队列9依次出队。

例如,对于上面的结果,依次进队后,结果如下:

队列1C1;队列3D3,队列4C4A4

将其依次出队后,结果为C1D3C4A4

然后,再建立4个队列,用于存放花色。将卡牌依花色AD存放入队列14中,然后再按队列1到队列4依次出队。

例如,对于上面刚刚出队的序列C1D3C4A4,将其依次进队,结果如下:

队列1A4;队列3C1C4;队列4D3

将其依次出队后,结果为A4C1C4D3,排序结束。

 

请根据上面的算法,编写一个用队列对扑克牌排序的程序,要求依照上面的排序规则,根据先花色后点数的方法进行排序。

 

输入
输入分为两行,第一行为一个整数n,表示一共有n张牌(1<=n<=100)
第二行用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
这个题目我选择用Java写,自己构建一个队列,写个比较方法然后进行操作。没想到一次就ac了。
 
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 ;
        }
    }
}
 
 
用G++实现:
 
#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)洗牌算法,它保证了每种排列出现的...

    VC扑克牌游戏

    2. **C++面向对象编程**:源码中会展示如何定义和使用类来表示扑克牌、玩家、牌堆等概念。面向对象编程的核心思想如封装、继承和多态在扑克牌游戏中都会有所体现。 3. **事件驱动编程**:扑克牌游戏的界面会响应...

    数据结构课程设计:手机通通讯录模拟,24点扑克牌游戏)

    本项目选择了两个经典实例:手机通讯录模拟和24点扑克牌游戏,这两个主题都是很好的数据结构应用场景,能充分展示链表、树、排序等基本数据结构的运用。 首先,让我们关注手机通讯录模拟。通讯录是一个存储联系人...

    扑克牌游戏 java源码

    在本项目中,我们讨论的是一个使用Java编程语言实现的扑克牌游戏,特别是蜘蛛纸牌。这个项目结合了计算机图形学的知识,使游戏界面更加生动和互动。下面将详细阐述涉及的技术点和知识点。 首先,Java是编程的核心...

    54张扑克牌图片

    在编程练习中,可以用这些图片作为测试数据,开发扑克牌排序算法。在数据分析项目中,可以分析不同花色和数字出现的频率。 在实际应用中,处理这些图片时,开发者可能需要掌握以下IT知识点: 1. 图像处理库:如...

    堆排序,插入排序和优先对排序的运行时间的比较

    插入排序是一种简单直观的排序算法,它的工作原理类似于人们整理扑克牌。对于一个未排序的序列,插入排序会遍历每个元素,将其与已排序的部分进行比较,然后插入到正确的位置。插入排序在处理小规模或部分有序的数据...

    拱猪扑克牌游戏源代码

    本项目是用C#编程语言实现的拱猪扑克牌游戏源代码,对于想要学习C#游戏编程的初学者来说,这是一个非常实用的学习资源。下面将详细探讨这个项目中涉及的C#和游戏编程相关知识。 首先,C#是一种面向对象的编程语言,...

    第28章、排序、栈和队列(理论课).ppt

    - **定义**:插入排序是一种简单直观的排序算法,其工作原理类似于人们在打扑克牌时整理手里的牌的过程。 - **基本思想**: - 从第一个元素开始,该元素可以认为已经被排序; - 取出下一个元素,在已经排序的元素...

    C语言8种排序

    插入排序是将每个元素插入到已排序好的序列中的适当位置,类似于打扑克牌时整理手牌的过程。插入排序在处理小规模数据或近乎有序的数据时表现出色,但在大规模无序数据上效率较低。 归并排序是分治法的典型应用,它...

    个人写的几个排序算法

    1. 插入排序:插入排序是一种简单的排序算法,它的工作原理类似于打扑克牌。已排序的部分保持不变,未排序的元素逐个插入到已排序部分的正确位置。在C++中,可以使用两层循环实现,外层循环控制未排序部分,内层循环...

    android扑克大战游戏源码

    5. **数据结构与算法**:扑克牌的存储和操作可能涉及到数组、列表、栈或队列等数据结构,以及排序、比较等算法。理解并优化这些数据结构和算法可以提高游戏的性能。 6. **事件监听与回调**:在Android中,用户操作...

    java-排序算法总结

    插入排序的工作原理类似于整理扑克牌,每张新牌插入到已排序好的序列的正确位置。Java实现插入排序时,会使用一个for循环和一个while循环,将未排序的元素逐个插入到已排序的部分。 4. 快速排序(Quick Sort) 快速...

    java数据结构用到的排序程序

    直接插入排序是一种简单的排序算法,它的工作原理类似于打扑克牌。每次将一个待排序的元素插入到已经排好序的序列中的正确位置。这个过程通过一个while循环来实现,比较当前元素与前面已排序的元素,直到找到合适的...

    几个简单的排序算法

    3. 插入排序:插入排序的工作原理类似于整理扑克牌,将未排序的元素依次插入到已排序部分的正确位置。在最好情况(已排序数组)下,时间复杂度为O(n),但在最坏情况下,它仍然是O(n^2)。 4. 快速排序:由C.A.R. ...

    10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等

    - 直接插入排序:类似于玩扑克牌,每次取一张未排序的牌并找到合适的位置插入已排序的牌堆中。直接插入排序.c文件将实现这一逻辑。 4. **括号匹配**:这是字符串处理中的一个常见问题,用于检查一个字符串中的括号...

    C++中各种排序算法大集锦

    插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌。对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以通过两层循环来实现,外层循环控制未排序部分,内层循环则找到...

    实验5-排序方法1

    它的工作原理类似于人们手动排序一副扑克牌,将每个元素插入到已排序部分的正确位置。时间复杂度在最好和最坏情况下分别为O(n)和O(n^2)。 4. **希尔排序**:插入排序的优化版本,通过增加元素间的跨度来减少比较和...

    Java经典排序

    2. **插入排序**:插入排序的工作原理类似于我们手动整理扑克牌的过程。它遍历数组,将每个元素插入到已排序部分的正确位置。插入排序在处理小规模或部分有序的数据时效率较高。 3. **选择排序**:选择排序每次迭代...

    纸牌游戏数据结构课程设计

    例如,可以使用数组或链表存储牌组,用栈来处理玩家的手牌,用队列来模拟洗牌过程,甚至可能用哈希表来快速查找特定的牌。 2. **类与对象**:面向对象编程是实现游戏逻辑的理想选择。我们可以创建`Card`类来表示每...

Global site tag (gtag.js) - Google Analytics