[プログラミングの質問]魂の鳥開始!

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/m1f2c3/article/details/99342091

[プログラミングの質問]魂の鳥開始!
制限時間:1秒

スペースの制約:32768K

パケットは最近、麻雀ゲームの魂と呼ばれる、このゲームはあまりにも複雑で、パケットは数ヶ月のために遊んで以下を失う勝つ鳥と恋に落ちました。
以下のように怒っているパケットが少しは一色だけを残して、麻雀の新しい種類を発明したルールに従ってゲーム、およびいくつかの特別な方法やカードの除去を簡素化します(たとえば、7組、など)は、特定のルールは以下のとおりです。

36枚のタイルの総数、各タイルは、1~9です。各番号4枚のカード。
それは、以下の条件を満たしていればあなたの手には、14枚のカードの一つであり、14枚のカード、すなわちカードをカウントし、
14枚のカードは、鳥の頭と呼ばれる2枚の同一のデジタルカードを持っています。
カード2を取り外し、残りの12枚のカードは、4つのサブストレート又は刻印から構成されてもよいです。直三つの連続増分数のカードを意味する(例えば、234567など)、プンは、同じ3桁のカード番号を意味する(例えば、111777)

例えば:
11122266677799は、カードができる4つのサブ1,2,6,7が刻まと鳥ヘッド9の構成とすることができる
11112233567 789は、4つの直線123123567789のグループと鳥の頭部を行うと、カードができ
11122233356779 1237年に関係なく、鳥の頭を行い、ブランドを作ることができないものを条件。

さて、36枚のカードから13枚のカードのパケットを抽出し、彼は23枚のカードの残りの部分を知りたいと思ったし、その後いくつかのデジタルカードとカードを取るためにカードは、することができ取ります。

説明入力:
入力単一ライン、13桁を含むが、スペースで区切られた、1〜9の各桁は、デジタルデータは、アイソフォームは4回まで発生することを保証することです。

説明出力:
出力ラインが1つの以上の数字を含むと同じです。彼に代わって、その後することができますし、カードのカードを取ります。条件は、小さな出力の大きな順に押してカードのさまざまな満たされた場合。ライセンスの条件を満たしていない場合は、してください出力デジタル0

例1入力:
1112225556669

出力例1:
9

実施例の説明1:
4つのサブ1,2,6,7刻印や鳥ヘッド9から構成されてもよいです

例2入力:
1111223356789

出力例2:
47

2例:
鳥の頭456789または123123567の1からなる、直四つのグループ

例3入力:
1112223335779

出力例3:
0

3例:
カード用と任意のカードがありません

クレイジー再帰

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = new int[10];
        for(int i = 0; i < 13; ++i){
            int temp = sc.nextInt();
            ++nums[temp - 1];
        }
        boolean flag = false;
        for(int i = 0; i < 9; ++i){
            if(nums[i] < 4){
                ++nums[i];
                if(hu(nums, 0)){
                    System.out.printf("%d ", i + 1);
                    flag = true;
                }
                --nums[i];
            }
        }
        if(flag == false)System.out.println(0);
    }

    public static boolean hu(int[] nums, int flag){
        int sum = 0;
        for(int i = 0; i < 9; ++i)sum += nums[i];
        if(sum == 0)return true;
        if(flag == 0){
            for(int i = 0; i < 9; ++i){
                if(nums[i] >= 2){
                    nums[i] -= 2;
                    boolean temp = hu(nums, 1);
                    nums[i] += 2;
                    if(temp) return true;
                }
            }
        }else {
            for(int i = 0; i < 9; ++i){
                if(nums[i] >= 3){
                    nums[i] -= 3;
                    boolean temp = hu(nums, 1);
                    nums[i] += 3;
                    if(temp)return true;
                }
            }

            for(int i = 0; i < 9; ++i){
                if(nums[i] > 0 && nums[i + 1] > 0 && nums[i + 2] > 0){
                    --nums[i];--nums[i + 1];--nums[i + 2];
                    boolean temp = hu(nums, 1);
                    ++nums[i];++nums[i + 1];++nums[i + 2];
                    if(temp)return true;
                }
            }
        }
        return false;
    }
}

おすすめ

転載: blog.csdn.net/m1f2c3/article/details/99342091