Matematikawan Finlandia, Inkara, menghabiskan tiga bulan merancang teka-teki Sudoku tersulit di dunia, dan jawabannya hanya ada satu. Inkara mengatakan hanya pemikir tercepat dan pemikir paling cerdas yang bisa memecahkan masalah ini.
Hari ini, sebuah berita dari Tencent mengatakan bahwa seorang lelaki tua Tiongkok memecahkan kotak sembilan kotak tersulit di dunia dalam tiga hari. Meskipun lelaki tua itu pada akhirnya mengubah angka, hal itu membangkitkan minat saya dan ingin menyelesaikan masalah melalui a program komputer, jadi saya menginap di asrama selama satu sore dan akhirnya berhasil menyelesaikannya, kode sumber programnya adalah sebagai berikut.
Copy kode kodenya sebagai berikut:
nomor paketPermainan;
kelas publik Poin {
private int col;//nomor baris
baris int pribadi;//nomor kolom
bendera boolean pribadi; // Benar tidak disetel.
nilai int pribadi;
//Titik konstruksi
Poin publik(int kolom, baris int, bendera boolean, nilai int) {
super();
this.col = kolom;
ini.baris = baris;
this.flag = bendera;
this.nilai = nilai;
}
kekosongan publik changeFlag() {
bendera = !bendera;
}
boolean publik getFlag() {
bendera kembali;
}
publik int getValue() {
nilai kembalian;
}
public void setValue(nilai int) {
this.nilai = nilai;
}
boolean publik canHere(Titik[][] pArr) {
boolean cb = canCol(pArr);
boolean cr = canRow(pArr);
boolean cminiArr = canMiniArr(pArr);
kembalikan cb && cr && cminiArr;
}
//Nilai apakah ada elemen yang sama di grid 3*3 kecil
boolean pribadi canMiniArr(Titik[][] pArr) {
int coltemp = ini.col % 3;
int suhu baris = ini.baris % 3;
for (int i = this.col - coltemp; i < col + (3 - coltemp); i++) {
for (int j = ini.baris - suhu baris; j < baris + (3 - suhu baris); j++) {
if(i == ini.col && j == ini.baris){
melanjutkan;
}kalau tidak{
if(ini.nilai == pArr[i][j].getValue()){
kembali salah;
}
}
}
}
kembali benar;
}
// Tentukan apakah ada elemen yang sama di kolom
boolean pribadi canRow(Titik[][] pArr) {
untuk (int saya = 0; saya < 9; saya++) {
if (i == ini.col) {
melanjutkan;
} kalau tidak {
if (this.value == pArr[i][this.row].value) {//Baris berubah, kolom tetap tidak berubah
kembali salah;
}
}
}
kembali benar;
}
// Tentukan apakah ada elemen yang sama pada baris tersebut
boolean pribadi canCol(Titik[][] pArr) {
untuk (int saya = 0; saya < 9; saya++) {
if (i == ini.baris) {
melanjutkan;
} kalau tidak {
if (this.value == pArr[this.col][i].value) {//Tepi kolom, baris tidak berubah
kembali salah;
}
}
}
kembali benar;
}
}
―Kode salinan program utama adalah sebagai berikut:
nomor paketPermainan;
impor java.io.BufferedReader;
impor java.io.IOException;
impor java.io.InputStreamReader;
impor java.util.ArrayList;
kelas publik Nomor99 {
public static void main(String[] args) melempar IOException{
Titik[][] numMat = Titik baru[9][9];
Daftar Array<Titik> al = Daftar Array baru<Titik>();
initNumMat(numMat,al);
setNum(numMat,al);
printMat(numMat);
}
private static void setNum(Titik[][] numMat,ArrayList<Point> al) {
ke dalam saya = 0;
ke dalam j = 0;
Mengerjakan{
jika (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v <= 9; v++) {//Tambahkan satu ke nilai posisi yang dikembalikan.
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {//Persyaratan terpenuhi dan tidak ada konflik.
numMat[i][j].changeFlag();//Ubah tandanya menjadi false. Menandakan sudah disetel.
merusak;
}else{//Tidak memenuhi syarat, konflik. Nilai nilai bertambah satu kali
}
while(v == 9){//Jika 1-9 tidak dapat memenuhi persyaratan, setel ulang posisi awal ke 0 terlebih dahulu, mundur satu spasi, dan tambahkan satu ke nilai posisi yang dikembalikan (bila posisi yang dikembalikan adalah Kapan nilainya bukan 9, dijamin posisi yang dikembalikan bukan titik awal grid Jiugong).
numMat[i][j].setValue(0);
J--;
jika(j==-1){
saya--;j=8;
}
while(al.contains(numMat[i][j])){//Jika posisi yang dikembalikan adalah titik awal grid Jiugong, terus mundur hingga bukan titiknya sendiri dan lompat keluar dari while.
J--;
jika(j==-1){
saya--;j=8;
}
}
numMat[i][j].changeFlag();//Akan ditandai
v = angkaMat[i][j].getValue();
}
}
}
j++;
jika(j==9){
j=0;i++;//i++ di sini dapat menyebabkan i bertambah menjadi 9, jadi penilaian berikut memerlukan i!=9
}
jika(saya!=9){
while(al.berisi(numMat[i][j])){
j++;
jika(j==9){
j=0;i++;
}
}
}
}sementara(saya!=9);
}
public static void initNumMat(Point[][] numMat,ArrayList<Point> al) melempar IOException {
for (int i = 0; i < numMat.length; i++) {
untuk (int j = 0; j < numMat[i].panjang; j++) {
numMat[i][j] = Titik baru(i, j, benar, 0);
}
}
initNumMat2(numMat, al);
}
public static void initNumMat2(Point[][] numMat, ArrayList<Point> al) melempar IOException {
BufferedReader br = BufferedReader baru(InputStreamReader(Sistem.in) baru);
String[] p = String baru[3];
Garis string=null;
System.out.println("Silakan masukkan informasi titik sesuai format (nomor baris i, nomor kolom j dan nilai v), masukkan di atas: ijv");
while((baris = br.readLine())!=null){
if(line.equals("over"))
merusak;
p = baris.trim().split(" +");
numMat[Integer.parseInt(p[0])][Integer.parseInt(p[1])].setValue(Integer.parseInt(p[2]));
numMat[Bilangan Bulat.parseInt(p[0])][Bilangan Bulat.parseInt(p[1])].changeFlag();
al.add(numMat[Bilangan Bulat.parseInt(p[0])][Bilangan Bulat.parseInt(p[1])]);
}
}
public static void printMat(Titik[][] numMat) {
System.out.println("--------┬---------┬---------┐");
for (int i = 0; i < numMat.length; i++) {
untuk (int j = 0; j < numMat[i].panjang; j++) {
jika ((j + 1) % 3 == 0)
Sistem.keluar.cetak(numMat[i][j].getValue() + " | ");
kalau tidak
Sistem.keluar.cetak(numMat[i][j].getValue() + " ");
}
jika ((i + 1) % 3 == 0)
System.out.println("/r/n--------┼---------┼---------┤");
kalau tidak
Sistem.keluar.println();
}
}
}
---Jalankan programnya
Silakan masukkan informasi titik sesuai format (nomor baris i, nomor kolom j dan nilai v), dan masukkan di atas: ijv saat memasukkan.
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
lebih
――┬―――┬―――┐
8 1 2 |.7 5 3 |
9 4 3 |
6 7 5 |.4 9 1 |
――┼―――┼―――┤
1 5 4 |
3 6 9 |.8 4 5 |
2 8 7 |
――┼―――┼―――┤
5 2 1 |.9 7 4 |
4 3 8 |.5 2 6 |
7 9 6 |.3 1 8 |
――┼―――┼―――┤