有N张扑克牌(A,2,3,4,5,6,7,8,9,10,J,Q,K),写个程序判断这N张牌里能不能有顺子(顺子是>=5张的连续牌).能就返回组成的顺子(有多少返回多少),不能就返回NULL.

解决方案 »

  1.   

    定义N(<=13)个List,分别存放A-K的总个数;
    定义一个TreeMap(排序的),以1-13为key,对应的13个List作为value;
    余下的就是检索这个Map来输出是否有顺子了~
      

  2.   

    import java.util.ArrayList;
    import java.util.TreeSet;public class Main { /**
     * @param args
     */
    public static void main(String[] args) { String[] cards = {"6", "2" ,"3" ,"7" ,"4", "5", "8", "8", "10", "10", "10", "J", "K", "Q", "A"};
    TreeSet<Integer> set = init(cards);
    ArrayList<String> result = check(set);
    printResult(result);

    System.out.println("程序结束!!");


    }

    private static TreeSet<Integer> init(String[] cards) {
    TreeSet<Integer> set = new TreeSet<Integer>();
    for(String s:cards) {
    if(s.charAt(0)>='1'&&s.charAt(0)<='9') {
    set.add(Integer.parseInt(s));
    }else {
    switch(s.toUpperCase().charAt(0)) {
    case 'J':
    set.add(11); break;
    case 'Q':
    set.add(12); break;
    case 'K':
    set.add(13); break;
    case 'A':
    set.add(14); break;
    }
    }
    }
    return set;

    }

    private static ArrayList<String> check(TreeSet<Integer> set) {
    ArrayList<String> result = new ArrayList<String>();
    StringBuilder temp = new StringBuilder();
    int count = 0;
    Integer[] nums = new Integer[1];
    nums = set.toArray(nums);
    int begin = 0;
    for(Integer i:set) {
    if(count == 0) {
    begin = i;
    count++;
    temp.append(numToCard(begin));
    }else if(i == begin+count) {
    temp.append(", "+numToCard(i));
    count++;
    }else {
    if(count>4) {
    result.add(temp.toString());
    }
    begin = i;
    temp.replace(0, temp.length(), numToCard(i)+"");
    count = 1;
    }
    }

    if(count>4) result.add(temp.toString());
    return result;
    }

    private static String numToCard(int x) {
    if(x>10) {
    switch(x) {
    case 11:
    return "J";
    case 12:
    return "Q";
    case 13:
    return "K";
    case 14:
    return "A";
    }
    }else {
    return x+"";
    }
    return null;
    }

    private static void printResult(ArrayList<String> result) {
    if(result.size() == 0) {
    System.out.println("没有顺子!!");
    }else {
    System.out.println("共有"+result.size()+"个顺子:");
    for(String s:result) {
    System.out.println(s);
    }
    }
    }
    }
      

  3.   

    int[] d = {1,2,3,4,5,6,7,8,10,11,12,13};
    int s = 0;
    for(int i=0; i<d.length; ++i){
    s |= 1<<(d[i]-1);
    }
    if((s&1)==1)
    s |= 1<<(14-1);//有1在的时候也可以当A

    int l = 0x1f;//11111
    int total = 0;
    for(int i=0; i<=9; ++i){
    if(((l<<i)&s) == (l<<i))
    ++total;
    }
    System.out.println(total);
      

  4.   

    andycpp(幻瞳) 
    -----------------
    谢谢(andycpp(幻瞳))写的可以,还应该改进一下.我觉得你输出的2,3,4,5,6,7,8里还要排列一下,因为长度>=5就可以成顺子,应该还有2,3,4,5,6或3,4,5,6,7或4,5,6,7,8等等.改好了就结分.
      

  5.   

    其他代码不变,你把printResult函数替换为下面新的实现就可以了 private static void printResult(ArrayList<String> result) {
    int count = 0;
    String[] nodes = null;
    if(result.size() == 0) {
    System.out.println("没有顺子!!");
    }else {
    for(String s:result) {
    nodes = s.split(",");
    count += (1+(nodes.length-4))*(nodes.length-4)/2;
    }
    System.out.println("共有"+count+"个顺子:");
    for(String s:result) {
    nodes = s.split(",");
    for(int i=5; i<=nodes.length; i++)
    for(int j=0; i-j>4; j++) {
    System.out.print(nodes[j].trim());
    for(int x = j+1; x<i; x++) {
    System.out.print("," + nodes[x]);
    }
    System.out.println();
    }
    }
    }
    }
      

  6.   

    // Shunzi.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "stdlib.h"
    #include "iostream.h"
    #define POINTNUM 5  ///最多有13張牌 可以自行設置
    //using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
    //char pk[13] = {'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'};
    int Judge[15] = {0};
    if(POINTNUM < 5)
    {
    cout<<"不符合要求的輸入";
    exit(0);
    }
    cout << "請輸入你所得的牌點數"<<endl;
    for (int i=0, char ch; i<POINTNUM; i++)
    {
    cin>> ch;
    switch(ch)
    {
    case 'A': Judge[1]++; break;
    case '1': Judge[2]++; break;
    case '2': Judge[3]++; break;
    case '3': Judge[4]++; break;
    case '4': Judge[5]++; break;
    case '5': Judge[6]++; break;
    case '6': Judge[7]++; break;
    case '7': Judge[8]++; break;
    case '8': Judge[9]++; break;
    case '9': Judge[10]++; break;
    case '10': Judge[11]++; break;
    case 'J': Judge[12]++; break;
    case 'Q': Judge[13]++; break;
    case 'K': Judge[14]++; break;
    }
    }
    for (int j=1; j<15; )
    {
    if (Judge[j] > 1)   ///有二張以上一樣的牌
    {
    cout<<"您的牌點不是順子"<<endl;
    return 0;
    break;
    }
    if (!Judge[j])   
    {
    j++;
    }
    for (int k=j; k<15 && ((15-j)>=5) && (k<=POINTNUM);)
    {
    if (!Judge[k+1])
    {
    j++;
    break;
    }
    else if (Judge[k+1] > 1)
    {
    cout<<"您的牌點不是順子"<<endl;
    return 0;
    break;
    }
    else
    k++;
    if (k == POINTNUM)
    {
    cout<<"恭喜!您的牌點是順子"<<endl;
    break;
    }
    }
    j++;
    }
    return 0;
    }本人用C++ 寫的, 供參考.
      

  7.   

    public static void getCards(int[] cards){
            Arrays.sort(cards);
            boolean hasAce = false;
            String result = "";
            int before = 0;
            int len = 0;
            for(int i=0;i<=cards.length-5;i++){
                result = "" + cards[i];
                before = cards[i];
                len = 1;
                for(int j=i+1;j<cards.length;j++){
                    if(cards[i]==1){
                        hasAce = true;
                        break;
                    }
                    if(cards[j]-before>1){
                        break;
                    }else if(cards[j]-before==0){
                        before = cards[j];
                        continue;
                    }else{
                        before = cards[j];
                        result = result + " " + cards[j];
                        len++;
                        if(len>=5){
                            System.out.println(result);
                        }
                        if(cards[j]==13&&len>=4&&hasAce){
                            System.out.println(result + " 1");
                        }
                    }
                }     
            }
        }int[] d = {1,10,12,9,2,5,9,7,13,8,11};
    输出:
    7 8 9 10 11
    7 8 9 10 11 12
    7 8 9 10 11 12 13
    7 8 9 10 11 12 13 1
    8 9 10 11 12
    8 9 10 11 12 13
    8 9 10 11 12 13 1
    9 10 11 12 13
    9 10 11 12 13 1
    9 10 11 12 13
    9 10 11 12 13 1
      

  8.   

    不好意思  發錯了, SORRY!!!
    正確的程式:
         // Shunzi.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "stdlib.h"
    #include "iostream.h"
    #define POINTNUM 5  ///最多有13張牌 可以自行設置
    //using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
    //char pk[13] = {'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'};
    int Judge[15] = {0};
    if(POINTNUM < 5)
    {
    cout<<"不符合要求的輸入";
    exit(0);
    }
    cout << "請輸入你所得的牌點數"<<endl;
    for (int i=0, char ch; i<POINTNUM; i++)
    {
    cin>> ch;
    switch(ch)
    {
    case 'A': Judge[1]++; break;
    case '1': Judge[2]++; break;
    case '2': Judge[3]++; break;
    case '3': Judge[4]++; break;
    case '4': Judge[5]++; break;
    case '5': Judge[6]++; break;
    case '6': Judge[7]++; break;
    case '7': Judge[8]++; break;
    case '8': Judge[9]++; break;
    case '9': Judge[10]++; break;
    case '10': Judge[11]++; break;
    case 'J': Judge[12]++; break;
    case 'Q': Judge[13]++; break;
    case 'K': Judge[14]++; break;
    }
    }
    int nCount = 0;
    for (int j=1; j<15; )
    {
    if (Judge[j] > 1)   ///有二張以上一樣的牌
    {
    cout<<"您的牌點不是順子"<<endl;
    return 0;
    break;
    }
    if (!Judge[j])   
    {
    j++;
    }
    nCount = 1;
    for (int k=j; k<15&& ((15-j)>=POINTNUM);)
    {
    if (Judge[k] == Judge[k+1])
    {
    nCount++;
    }
    else
    {
    break;
    }
    if (nCount == POINTNUM)
    {
    cout<<"恭喜!您的牌點是順子"<<endl;
    return 0;
    //break;
    }
    }
    j++;
    }
    return 0;
    }
      

  9.   

    cft 楼主
    下次问问题估计没什么人热心回答了
    很多人花了心思的,没有安慰分。。
      

  10.   

    上面的算法 可能不是很好理解
    下面的算法 只要是学国编程的人都看得懂
    不信 你试试看!  呵呵
    package math;import java.util.*;public class Calculate {
        private void caculated() {
            char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'J',
                         'O', 'K'};
            int n = 0;
            for (int k = 0; k < 9; k++) {
                for (int i = 0+n; i <= arr.length - 5; i++) {                for (int j =  n; j < 5 + i; j++) {
                        System.out.print(arr[j]);
                    }              
                    System.out.println();
                }
                n = n + 1;
            }
        }
        public static void main(String[] args) {
            Calculate calculate = new Calculate();
            calculate.caculated();
        }
    }
      

  11.   

    package math;import java.util.*;public class Calculate {
        private void caculated() {
            char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'J','O', 'K'};   
            int n = 0;
            for (int k = 0; k < 9; k++) {
                for (int i = n; i <= arr.length - 5; i++) {                for (int j = n; j < 5 + i; j++) {
                        System.out.print(arr[j]);
                    }              
                    System.out.println();
                }
                n = n + 1;
            }
        }
        public static void main(String[] args) {
            Calculate calculate = new Calculate();
            calculate.caculated();
        }
    }