質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

760閲覧

数独解法の一つである下記Javaコードを、日本語の疑似コード化していただきたいです。

7sstrictly

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/02 14:52

こんにちは、都内の高校生です。
数独の解法の一つである単一候補法のソースコードを頂いたのですが、javaは初めてで疎く、何とか解読しようとしていますが分かりませんでした。

Javaに詳しい方に以下のコードを解読していただきたいです。

よろしくお願いします。

/**
* 単一候補法
* @param mat
* @param candmat
*/
public void SinglizeCandidateLogic(int[][] mat, int[][] candmat)
{
List<Integer> candList = new ArrayList<>();

for (int i = 0; i < Utility.ROW; i++) for (int j = 0; j < Utility.COL; j++) if (candmat[i][j] > 0) { //候補の取得 candList = Utility.GetOnBitList(candmat[i][j]); if (candList.size() == 1) {//1個しか候補なかったら記憶したビットに対応する数字を確定 mat[i][j] = candList.get(0); Utility.ExcludeCandidateInRowColBlock(candmat, new Point(i, j), (int)Math.pow(2, candList.get(0))); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/09/02 15:09

Utilityクラスの定義を見ずに解読することはできません。Point も。 質問には十分な情報を追加してください。
kazuma-s

2020/09/04 01:17

> 数独の解法の一つである単一候補法のソースコードを頂いたのですが、 そのコードを全部見せてもらえれば解読できます。見せることのできない理由があるのですか?
7sstrictly

2020/09/04 01:24

こんにちは。ご連絡ありがとうございます やましい理由は全然ありませんが、皆さんの評価通り、自分としても丸投げのような質問で負い目の気持ちがあり放棄していました。 追加分のコードもかなり複雑で、回答者様を悩ましてしまうかもしれないと考えていました。申し訳ありません。 それでも良かったら追加させて頂きます。
kazuma-s

2020/09/04 01:50

コードを全部提示することが丸投げではありません。そのコードについて、あなたが考えたこと、この部分は分かるが、こことここが分からない、自分はこのように解釈しているが間違っているようだ、というようなことを書いてないのが丸投げです。
guest

回答1

0

日本語の疑似コードとはどのようなものでしょうか?
例示できますか?

さて、Java は名前に日本語が使えます。例えばこんな風に、

import java.util.*; // List, ArrayList class Cand { /** * 単一候補法 * @param 行列 (matrix) * @param 候補行列 (candidate matrix) */ public void 単一候補法(int[][] 行列, int[][] 候補行列) { List<Integer> 候補リスト = new ArrayList<>(); for (int i = 0; i < Utility.行; i++) for (int j = 0; j < Utility.列; j++) if (候補行列[i][j] > 0) { //候補の取得 候補リスト = Utility.オンビットのリスト取得(候補行列[i][j]); if (候補リスト.size() == 1) { //1個しか候補なかったら記憶したビットに対応する数字を確定 行列[i][j] = 候補リスト.get(0); Utility.行と列とブロックの中の候補を排除( 候補行列, new Point(i, j), (int)Math.pow(2, 候補リスト.get(0)) ); } } } } class Utility { static final int 行 = 9, 列 = 9; static List<Integer> オンビットのリスト取得(int 候補) { List<Integer> 候補リスト = new ArrayList<>(); for (int i = 1; i <= 9; i++) if ((候補 >> i & 1) == 1) 候補リスト.add(i); return 候補リスト; } static void 行と列とブロックの中の候補を排除( int[][] 候補行列, Point 点, int ビット ) { int r = 点.row, c = 点.col; for (int i = 0; i < 9; i++) { 候補行列[r][i] &= ~ビット; 候補行列[i][c] &= ~ビット; } r = r / 3 * 3; c = c / 3 * 3; for (int k = r + 3; r < k; r++) { 候補行列[r][c] &= ~ビット; 候補行列[r][c+1] &= ~ビット; 候補行列[r][c+2] &= ~ビット; } 候補行列[点.row][点.col] |= ビット; } static void 候補行列表示(int[][] 候補行列) { for (int i = 0; i < 9; i++) { for (int k = 1; k <= 9; k += 3) { for (int j = 0; j < 9; j++) 候補表示(候補行列[i][j], k); System.out.println(); } System.out.println(); } System.out.println("--"); } static void 候補表示(int b, int k) { System.out.print(" "); for (int i = 0; i < 3; i++) System.out.print(((1<<(k+i)) & b) != 0 ? (char)('0' + k+i) : '.'); } } class Point { int row, col; Point(int i, int j) { row = i; col = j; } } class Test { int[][] 行列 = { { 0, 8, 4, 0, 0, 0, 3, 7, 0 }, { 6, 0, 0, 3, 0, 9, 0, 0, 2 }, { 2, 0, 0, 0, 0, 5, 0, 0, 8 }, { 0, 4, 9, 0, 0, 0, 0, 6, 0 }, { 0, 0, 0, 0, 6, 0, 0, 0, 0 }, { 0, 6, 0, 0, 0, 0, 2, 8, 0 }, { 3, 0, 0, 4, 0, 0, 0, 0, 6 }, { 9, 0, 0, 2, 0, 7, 0, 0, 4 }, { 0, 5, 7, 0, 0, 0, 9, 2, 0 } }; int[][] 候補行列 = new int[9][9]; public static void main(String[] args) { new Test(); } Test() { for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) if (行列[i][j] == 0) 候補行列[i][j] = 0x3fe; // 2進 0011 1111 1110 else 候補行列[i][j] = 1 << 行列[i][j]; Utility.候補行列表示(候補行列); Cand c = new Cand(); c.単一候補法(行列, 候補行列); Utility.候補行列表示(候補行列); c.単一候補法(行列, 候補行列); Utility.候補行列表示(候補行列); } }

実行してみると、c.単一候補法(行列, 候補行列); を繰り返すにしたがって
候補が減っていくのが分かるでしょう。

ただ、数独はこれだけでは解にたどり着けません。

なお、
List<Integer> 候補リスト = new ArrayList<>();
あとで代入があるから、List<Integer> 候補リスト; でいいし、
(int)Math.pow(2, 候補リスト.get(0)
1 << 候補リスト.get(0) にしたほうがいいでしょう。

投稿2020/09/04 03:24

編集2020/09/04 05:05
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問