Der finnische Mathematiker Inkara hat drei Monate damit verbracht, das schwierigste Sudoku-Rätsel der Welt zu entwerfen, und es gibt nur eine Antwort. Inkara sagte, nur die schnellsten Denker und die klügsten Köpfe können das Spiel knacken.
Heute hieß es in einer Nachricht von Tencent, dass ein chinesischer alter Mann in drei Tagen das schwierigste Neun-Quadrat-Gitter der Welt geknackt hat. Obwohl der alte Mann am Ende eine Zahl geändert hat, hat es mein Interesse geweckt und ich wollte das Problem durch a lösen Computerprogramm, also blieb ich einen Nachmittag im Wohnheim und löste es schließlich erfolgreich. Der Quellcode des Programms lautet wie folgt.
Kopieren Sie den Codecode wie folgt:
PaketnummerSpiel;
öffentliche Klasse Point {
private int col;//Zeilennummer
private int row;//Spaltennummer
privates boolesches Flag; // True ist nicht gesetzt.
privater int-Wert;
//Baupunkt
public Point(int col, int row, boolean flag, int value) {
super();
this.col = col;
this.row = row;
this.flag = flag;
this.value = value;
}
public void changeFlag() {
flag = !flag;
}
public boolean getFlag() {
Rückkehrflag;
}
public int getValue() {
Rückgabewert;
}
public void setValue(int value) {
this.value = value;
}
public boolean canHere(Point[][] pArr) {
boolean cb = canCol(pArr);
boolean cr = canRow(pArr);
boolean cminiArr = canMiniArr(pArr);
return cb && cr && cminiArr;
}
//Beurteilen Sie, ob das kleine 3*3-Raster dieselben Elemente enthält
privater boolescher Wert canMiniArr(Point[][] pArr) {
int coltemp = this.col % 3;
int rowtemp = this.row % 3;
for (int i = this.col - coltemp; i < col + (3 - coltemp); i++) {
for (int j = this.row - rowtemp; j < row + (3 - rowtemp); j++) {
if(i == this.col && j == this.row){
weitermachen;
}anders{
if(this.value == pArr[i][j].getValue()){
return false;
}
}
}
}
return true;
}
// Bestimmen Sie, ob die Spalte dieselben Elemente enthält
privater boolescher Wert canRow(Point[][] pArr) {
for (int i = 0; i < 9; i++) {
if (i == this.col) {
weitermachen;
} anders {
if (this.value == pArr[i][this.row].value) {//Die Zeile ändert sich, die Spalte bleibt unverändert
return false;
}
}
}
return true;
}
// Bestimmen Sie, ob in der Zeile dieselben Elemente vorhanden sind
privater boolescher Wert canCol(Point[][] pArr) {
for (int i = 0; i < 9; i++) {
if (i == this.row) {
weitermachen;
} anders {
if (this.value == pArr[this.col][i].value) {//Spaltenkanten, Zeilen unverändert
return false;
}
}
}
return true;
}
}
„Der Hauptprogramm-Kopiercode lautet wie folgt:
PaketnummerSpiel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
öffentliche Klasse Number99 {
public static void main(String[] args) löst eine IOException{ aus
Point[][] numMat = new Point[9][9];
ArrayList<Point> al = new ArrayList<Point>();
initNumMat(numMat,al);
setNum(numMat,al);
printMat(numMat);
}
private static void setNum(Point[][] numMat,ArrayList<Point> al) {
int i = 0;
int j = 0;
Tun{
if (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v <= 9; v++) {//Füge eins zum Wert der zurückgegebenen Position hinzu.
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {//Die Bedingungen sind erfüllt und es liegt kein Konflikt vor.
numMat[i][j].changeFlag();//Ändern Sie das Flag auf false. Zeigt an, dass es festgelegt wurde.
brechen;
}else{//Erfüllen Sie keine Bedingung, Konflikt. Der Wert value erhöht sich einmal
}
while(v == 9){//Wenn 1-9 die Anforderungen nicht erfüllen kann, setzen Sie zuerst die Ausgangsposition auf 0 zurück, gehen Sie ein Leerzeichen zurück und addieren Sie eins zum Wert der zurückgegebenen Position (wenn die zurückgegebene Position „When“ ist). Wenn der Wert nicht 9 ist, ist garantiert, dass die zurückgegebene Position nicht der ursprüngliche Punkt des Jiugong-Gitters ist.
numMat[i][j].setValue(0);
J--;
if(j==-1){
i--;j=8;
}
while(al.contains(numMat[i][j])){//Wenn die zurückgegebene Position der ursprüngliche Punkt des Jiugong-Gitters ist, ziehen Sie sich weiter zurück, bis es nicht mehr der eigene Punkt ist, und springen Sie aus while heraus.
J--;
if(j==-1){
i--;j=8;
}
}
numMat[i][j].changeFlag();//Wird markiert
v = numMat[i][j].getValue();
}
}
}
j++;
if(j==9){
j=0;i++;//i++ kann hier dazu führen, dass i auf 9 ansteigt, daher erfordert das folgende Urteil i!=9
}
if(i!=9){
while(al.contains(numMat[i][j])){
j++;
if(j==9){
j=0;i++;
}
}
}
}while(i!=9);
}
public static void initNumMat(Point[][] numMat,ArrayList<Point> al) löst eine IOException {
for (int i = 0; i < numMat.length; i++) {
for (int j = 0; j < numMat[i].length; j++) {
numMat[i][j] = new Point(i, j, true, 0);
}
}
initNumMat2(numMat, al);
}
public static void initNumMat2(Point[][] numMat, ArrayList<Point> al) löst eine IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] p = neuer String[3];
Zeichenfolge line=null;
System.out.println("Bitte geben Sie die Punktinformationen entsprechend dem Format ein (i Zeilennummer, j Spaltennummer und v-Wert), geben Sie über: ijv ein");
while((line = br.readLine())!=null){
if(line.equals("over"))
brechen;
p = line.trim().split(" +");
numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])].setValue(Integer.parseInt(p[2]));
numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])].changeFlag();
al.add(numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])]);
}
}
public static void printMat(Point[][] numMat) {
System.out.println("--------┬---------┬---------┐");
for (int i = 0; i < numMat.length; i++) {
for (int j = 0; j < numMat[i].length; j++) {
if ((j + 1) % 3 == 0)
System.out.print(numMat[i][j].getValue() + " | ");
anders
System.out.print(numMat[i][j].getValue() + " ");
}
if ((i + 1) % 3 == 0)
System.out.println("/r/n--------┼---------┼---------┤");
anders
System.out.println();
}
}
}
---Führen Sie das Programm aus
Bitte geben Sie die Punktinformationen entsprechend dem Format ein (i Zeilennummer, j Spaltennummer und v-Wert) und geben Sie bei der Eingabe Folgendes ein: ijv.
0 0 8
1 2 3
1 3 6
2 1 7
2 4 9
2 6 2
3 1 5
3 5 7
4 4 4
4 5 5
4 6 7
5 3 1
5 7 3
6 2 1
6 7 6
6 8 8
7 2 8
7 3 5
7 7 1
8 1 9
8 6 4
über
――┬―――┬―――┐
8 1 2 |. 7 5 3 |
9 4 3 |. 6 8 2 |
6 7 5 |. 4 9 1 |
――┼―――┼―――┤
1 5 4 |. 2 3 7 |
3 6 9 |. 8 4 5 |
2 8 7 |. 1 6 9 |
――┼―――┼―――┤
5 2 1 |. 9 7 4 |
4 3 8 |. 5 2 6 |
7 9 6 |. 3 1 8 |
――┼―――┼―――┤