0

隣接する 2 つの文字が同じにならないように、文字 A から F を含む N x N グリッドを印刷する必要があります。以下のコードは N x N グリッドを出力しますが、左右の文字が異なるだけです。上下の文字も異なるようにする方法が見つかりません。配列を使用せずにこの問題を解決する必要があります。文字はランダム化する必要があります。

public static void main(String[] args) {
    int N = StdIn.readInt();
    for (int column = 0; column < N; column++) {
        int x = 0;

        for (int row = 0; row < N; row++) {

            int c = (int) (Math.random() * 6 + 1);

            while (x == c) {
                c = (int) (Math.random() * 6 + 1);
            }
            if (c == 1) {
                System.out.print("A ");
            }
            if (c == 2) {
                System.out.print("B ");
            }
            if (c == 3) {
                System.out.print("C ");
            }
            if (c == 4) {
                System.out.print("D ");
            }
            if (c == 5) {
                System.out.print("E ");
            }
            if (c == 6) {
                System.out.print("F ");
            }

            x = c;

        }

        System.out.println();

    }
4

3 に答える 3

0

forループを少し単純化することに賛成しました

for (int row = 0; row < N; row++) {
  char c = (char) (Math.random() * 6 + 'A');
  while (x == c) {
    c = (char) (Math.random() * 6 + 'A');
  }
  System.out.print(c + " ");
  x = c;
}

これは文字のASCII値を使用するため、大きなifステートメントは必要ありません。

どのストレージ形式が許可されているかについての質問は不明ですが、これを考慮してください:各行を文字列(行を移動した後に削除される1つの一時的な文字列)として保存できる場合、行内の文字が下に再構築すると、上の文字と一致しますか?文字列を配列と考えてください(これが実際の形式です)。

于 2013-03-22T17:33:30.167 に答える
0

スタックのペアと候補キャラクターでこれを行うことができます。NxN グリッドは、最大 N × N 文字を含むスタックによって表されます。これをカードのデッキで試してみてください。スタックは、カードのスタックの 2 つのスポットで表され、どのように機能するかの感触をつかむことができます。

  1. A と B の 2 つのスタックを作成します。A の項目数の実行中のインデックスを保持します。
  2. 乱数を生成します。これがあなたの候補者です。
  3. スタック A に N の倍数のアイテムがある場合 (行を終了したばかり)、手順 6 に進みます。
  4. スタック A の一番上をポップし、Check として保存します。
  5. Check は Candidate に隣接していますか? はいの場合は、Check をスタック A に戻し、手順 2 に戻ります (null は隣接していません)。
  6. チェックをスタック B にプッシュします。さらに N-2 個のアイテムをポップし、それらをスタック B にプッシュします。
  7. スタック A の一番上をポップし、Check として保存します。(スタック B には N-1 個のアイテムがあり、チェックには 1 個のアイテムがあるはずです: 行全体)
  8. Check は Candidate に隣接していますか? (null は隣接していません) はいの場合、Check をスタック A に押し戻し、スタック B から各アイテムをポップし、スタック A に押し込み、ステップ 2 に戻ります。
  9. check をスタック A にプッシュ バックします。スタック B から各項目をポップし、スタック A にプッシュします。
  10. 候補をスタック A にプッシュします。
  11. インデックスをインクリメントします。スタック A に NxN 個のアイテムがある場合は、完了です。スタック A からすべてをポップし、NxN グリッドに書き留めます。それ以外の場合は、手順 2 に戻ります。

基本的にカードを引いて、アイテムを2つまでチェックします。スタック A には隣接関係がないことが保証されているため、アイテムが配置されると、アイテムを削除する必要はありません。だから最後までいったら終わり。

于 2013-03-22T19:18:26.113 に答える
0

2つのキューで簡単に実行できます。

以下を分析すると、実際にはサイズ N の連結リストが 1 つだけ必要であることがわかるはずです。

currentは現在の行であり、各新しい要素は単純にキューに入れられます。

last前の行です。current行の処理が完了すると、の値が取得されます。次に、チェックしたい最初の要素が先頭にあります。

最初の行を他の行から分離して、物事をより単純で理解しやすくしました。

  int N = 10;
  Queue<Character> last,
                   current = new Queue<Character>();
  char prev = '0';
  for (int row = 0; row < N; row++)
  {
     char c;
     do { c = (char)(Math.random() * 6 + 'A'); }
     while (prev == c);
     current.enqueue(c);
     prev = c;
     System.out.print(c + " ");
  }
  System.out.println();
  for (int col = 1; col < N; col++)
  {
     last = current;
     current = new Queue<Character>();
     prev = '0';
     for (int row = 0; row < N; row++)
     {
        char c;
        do { c = (char)(Math.random() * 6 + 'A'); }
        while (last.peek() == c || prev == c);
        current.enqueue(c);
        last.dequeue();
        prev = c;
        System.out.print(c + " ");
     }
     System.out.println();
  }
于 2013-03-22T18:15:56.037 に答える