HDU1016--素数リングの問題

HDU1016-素数リングの問題

1.トピックリンク

HDU1016

2.主題の内容

リングは、図に示すようにn個の円で構成されます。自然数1、2、…、nを各円に別々に入れ、2つの隣接する円の数の合計が素数になるはずです。
注:最初の円の数は常に1である必要があります。
ここに画像の説明を挿入

入力

n(0 <n <20)。

出力

出力フォーマットを以下のサンプルとして示します。各行は、1から時計回りおよび反時計回りに始まるリング内の一連の円番号を表します。番号の順序は、上記の要件を満たしている必要があります。ソリューションを辞書式順序で印刷します。
上記のプロセスを完了するプログラムを作成する必要があります。
各ケースの後に空白行を印刷します。

サンプル入力

6
8

サンプル出力

ケース1:
1 4 3 2 5 6
1 6 5 2 3 4
ケース2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

翻訳

図に示すように、リングはn個の円で構成されています。自然数1、2、...、nをそれぞれ各円に入れ、2つの隣接する円の数の合計が素数になるはずです。
注:最初の円の数は常に1である必要があります。
出力フォーマットを以下に示します。各行は、リングの時計回りと反時計回りの1から始まる一連の円番号を表します。番号のシーケンスは、上記の要件を満たしている必要があります。ソリューションを辞書式順序で印刷します。
上記のプロセスを完了するためのプログラムを作成します。
いずれの場合も、空白行が印刷されます。

三、質問は分解されます

今回のトピックは非常に簡潔で明確です。

自然数1、2、...、nをそれぞれ各円に入れ、2つの隣接する円の数の合計が素数になるはずです。
注:円の始点は常に1である必要があります。

この文は、次の3つの情報を示しています。

  1. 1からnまでの番号は、端から端まで接続されたリングに配置する必要があります。つまり、最初の番号と最後の番号が接続されます。
  2. 隣接する2つの数の合計は、素数でなければなりません。
  3. すべての出力番号は1で始まる必要があります。

では、問題を直接解決し始めます。

4つの問題解決のアイデア

まず、質問では、隣接する2つの数の合計が素数である必要があり、それを1つのリングに結合して、すべての数を使い切る必要があります。
それで、私たちの最初の反応は何でしたか?1の後の数字を1つずつキューに入れて、前の数字と素数を形成できるかどうかを確認します。可能であれば、シリーズを更新し、そうでない場合は、次の数字に切り替えて入れます。シーケンスを更新した後、シーケンスの長さがnに等しくなるか、一部の数値を挿入できなくなるまで、シーケンスを最初から再入力します。
例を見てみましょう。
たとえば、次のように入力します

6

このとき、最初にキューを初期化します。キューは

1

次に、2を1の後ろにパックできるかどうかを見てみましょう。1+2 = 3は素数です。プラグインして、キューを更新できます。

1 2

次に、3を挿入できるかどうかを確認し、2 + 3 = 5が素数であるかどうかを確認し、挿入して、キューを更新します

1 2 3

次に、4を挿入できるかどうかを確認し、3 + 4 = 7が素数であるかどうかを確認し、挿入して、キューを更新します

1 2 3 4

など、5 + 4 = 9は素数ではなく、次の
64 = 10を表示するのは素数+ではありませんが、現時点では次の数を詰め込むことはできません。この種類が機能しないことを証明すると、失敗します。デジタルに戻る
thisキューが戻るとき

1 2 3

4は後続の列につながるため、完全で
はありません。35= 8は素数+ではなく、次の
3 + 6 = 9は素数ではありませんが、後で彼らはそれを理解しませんでした。キューに戻ると、
これはキューに戻り続けます。

1 2

次に、この動作を繰り返します。質問の意味を満たす最初のキューを見つけることができます

1 4 3 2 5 6

次に、それを出力して、次のものを探し続けます。
これは、この質問の具体的なアイデアです。では、どのようにそれを達成するのですか?
前のステップのキューに戻らなければならない場合があるため、前のステップのキューをどのように保存するかが非常に重要です。データ構造を研究した人は、C ++スタックにそのような概念があることを知っている必要があります。これはまさに私たちが保存する必要があるものです。
スタックを使用して保存します。データ構造でスタックを使用する方法は何ですか?
はい、それは再帰なので、この質問を書くために再帰を使用します。
ストレージの問題を解決したら、次のステップは問題を判断することです。
足し算や引き算のたびに素数を判断する必要があるので、呼び出す関数として判断素数を書いておくとよいでしょう。
ただし、関数の呼び出しにも多くの計算時間がかかるため、事前に素数をマークする、つまり素数のテーブルを作成することができます。
最大タイトルnが20であるため、配列を作成します。41の配列を作成し、それを0に初期化してから、非素数を1としてマークします。特定のテーブルのコードに詳細なコメントがあります。 。
これらの大きな問題を解決した後、次のステップは問題の詳細に注意を払うことです。
まず第一に、トピックは複数のデータ入力であり、各データ入力には対応する注文ラベルが必要です。たとえば
、出力する最初のデータセット

ケース1:

注意すべき2番目のポイントは、データが実行可能なすべてのキューを見つけるたびに、空白行を出力する必要があるということです。
3番目のポイントも私がいつも無視してきたポイントです。データの各列が出力された後、余分なスペースがあってはなりません。
上記は、この問題の具体的な解決策と要点です。

5、参照コード

//
// Created by Verber.
//
#include "iostream"
#include "bits/stdc++.h"
#include "queue"
using namespace std;
int n;
int biao[42],zu[22],pd[22];//三个数组分别储存的是素数表,数列,以及判断该数字是否入队
void sushudabiao()//打表函数
{
    
    
    memset(biao,0,sizeof(biao));//初始化数组
    for (int i = 2; i<= 42; i++)
    {
    
    
        if(biao[i]==0)//如果是素数,它的倍数一定不是素数
        {
    
    
            for(int t=i*2;t<=42;t+=i)
            {
    
    
                biao[t]=1;
            }
        }
    }

}
void zhaohuan(int num)//递归函数
{
    
    
    if (num == n && biao[zu[0] + zu[n - 1]]==0)//当递归层数等于n时并且首尾数相加是素数的情况下跳出递归,输出数列
    {
    
    
        for (int i = 0; i <n-1; i++)
        {
    
    
            cout<<zu[i]<<" ";
        }
        cout<<zu[n-1]<<endl;//最后一个数字后面不能有多余的空格
        return;
    }
    else
    {
    
    
        for (int j = 2; j <= n; j++)//循环去寻找下一个塞进去数列的数字
        {
    
    
            if (!pd[j] && biao[j + zu[num - 1]]==0)
            {
    
    
                zu[num] = j;//把该数字入列
                pd[j] = 1;//表示该数字已入列
                zhaohuan(num + 1);//如果该数字能塞到当前数列后面,重新查找下一个数字
                pd[j] = 0;//当执行完上一步的递归后,无论能否成数列,都要让该数字出列,查找新的能塞到当前位置的数字,找新的数列。
            }
        }
    }
}
int main()
{
    
    
    sushudabiao();
    int i=1;
    while (scanf("%d",&n)!=EOF) {
    
    
        cout<<"Case "<<i++<<":"<<endl;
        zu[0] = 1;
        memset(pd,0,sizeof(pd));//每一步初始化判断列表。可省略
        zhaohuan(1);
        cout<<endl;

    }
}

おすすめ

転載: blog.csdn.net/Verber/article/details/113101714