Le mathématicien finlandais Inkara a passé trois mois à concevoir le puzzle Sudoku le plus difficile au monde, et il n'a qu'une seule réponse. Inkara a déclaré que seuls les penseurs les plus rapides et les esprits les plus brillants peuvent résoudre le jeu.
Aujourd'hui, une nouvelle de Tencent a déclaré qu'un vieil homme chinois avait réussi à percer la grille de neuf carrés la plus difficile au monde en trois jours. Bien que le vieil homme ait finalement changé un numéro, cela a suscité mon intérêt et a voulu résoudre le problème par un. programme informatique, je suis donc resté dans le dortoir pendant un après-midi et je l'ai finalement résolu avec succès, le code source du programme est le suivant.
Copiez le code comme suit :
numéro de packageJeu ;
Point de classe publique {
col int privé ; // numéro de ligne
ligne intérieure privée ; // numéro de colonne
indicateur booléen privé ; // True n'est pas défini.
valeur int privée ;
//Point de construction
point public (colonne int, ligne int, indicateur booléen, valeur int) {
super();
this.col = col;
this.row = ligne;
this.flag = drapeau ;
this.value = valeur ;
}
public void changeFlag() {
drapeau = !flag;
}
public booléen getFlag() {
drapeau de retour ;
}
public int getValue() {
valeur de retour ;
}
public void setValue (valeur int) {
this.value = valeur ;
}
public booléen canHere(Point[][] pArr) {
booléen cb = canCol(pArr);
booléen cr = canRow(pArr);
booléen cminiArr = canMiniArr(pArr);
retourner cb && cr && cminiArr;
}
// Juger s'il y a les mêmes éléments dans la petite grille 3*3
booléen privé 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){
continuer;
}autre{
if(this.value == pArr[i][j].getValue()){
renvoie faux ;
}
}
}
}
renvoie vrai ;
}
// Détermine s'il y a les mêmes éléments dans la colonne
booléen privé canRow(Point[][] pArr) {
pour (int je = 0; je < 9; i++) {
si (i == this.col) {
continuer;
} autre {
if (this.value == pArr[i][this.row].value) {//La ligne change, la colonne reste inchangée
renvoie faux ;
}
}
}
renvoie vrai ;
}
// Détermine s'il y a les mêmes éléments sur la ligne
booléen privé canCol(Point[][] pArr) {
pour (int je = 0; je < 9; i++) {
si (i == this.row) {
continuer;
} autre {
if (this.value == pArr[this.col][i].value) {//Bords de colonne, lignes inchangées
renvoie faux ;
}
}
}
renvoie vrai ;
}
}
―Le code de copie du programme principal est le suivant :
numéro de packageJeu ;
importer java.io.BufferedReader ;
importer java.io.IOException ;
importer java.io.InputStreamReader ;
importer java.util.ArrayList ;
classe publique Numéro99 {
public static void main(String[] args) lance IOException{
Point[][] numMat = nouveau 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 je = 0;
entier j = 0 ;
faire{
if (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v <= 9; v++) {//Ajoutez un à la valeur de la position renvoyée.
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {//Les conditions sont remplies et il n'y a pas de conflit.
numMat[i][j].changeFlag();//Changez l'indicateur en false. Indique qu'il a été défini.
casser;
}else{//ne satisfait à aucune condition, conflit. La valeur valeur s'incrémente une fois
}
while(v == 9){//Si 1-9 ne peut pas répondre aux exigences, réinitialisez d'abord la position d'origine à 0, reculez d'un espace et ajoutez-en un à la valeur de la position renvoyée (lorsque la position renvoyée est When la valeur n'est pas 9, il est garanti que la position renvoyée n'est pas le point d'origine de la grille Jiugong).
numMat[i][j].setValue(0);
j--;
si(j==-1){
je--;j=8;
}
while(al.contains(numMat[i][j])){//Si la position revenue est le point d'origine de la grille de Jiugong, continuez à reculer jusqu'à ce que ce ne soit plus votre propre point et sautez hors de while.
j--;
si(j==-1){
je--;j=8;
}
}
numMat[i][j].changeFlag();//Marquera
v = numMat[i][j].getValue();
}
}
}
j++;
si(j==9){
j=0;i++;//i++ ici peut faire augmenter i jusqu'à 9, donc le jugement suivant nécessite i!=9
}
si(i!=9){
while(al.contains(numMat[i][j])){
j++;
si(j==9){
j=0;i++;
}
}
}
}tandis que(i!=9);
}
public static void initNumMat(Point[][] numMat,ArrayList<Point> al) lance IOException {
pour (int i = 0; i < numMat.length; i++) {
pour (int j = 0; j < numMat[i].length; j++) {
numMat[i][j] = nouveau Point(i, j, true, 0);
}
}
initNumMat2(numMat, al);
}
public static void initNumMat2(Point[][] numMat, ArrayList<Point> al) lance IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Chaîne[] p = nouvelle Chaîne[3];
Ligne de chaîne=null ;
System.out.println("Veuillez saisir les informations sur le point selon le format (i numéro de ligne, j numéro de colonne et valeur v), saisissez par-dessus : ijv ");
while((line = br.readLine())!=null){
if(line.equals("over"))
casser;
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("--------┬---------┬---------┐");
pour (int i = 0; i < numMat.length; i++) {
pour (int j = 0; j < numMat[i].length; j++) {
si ((j + 1) % 3 == 0)
System.out.print(numMat[i][j].getValue() + " | ");
autre
System.out.print(numMat[i][j].getValue() + " ");
}
si ((i + 1) % 3 == 0)
System.out.println("/r/n--------┼-------------┼-------------┤");
autre
System.out.println();
}
}
}
---Exécutez le programme
Veuillez saisir les informations sur le point en fonction du format (numéro de ligne i, numéro de colonne j et valeur v), et saisissez over : ijv lors de la saisie.
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
sur
――┬―――┬―――┐
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 |
――┼―――┼―――┤