أمضى عالم الرياضيات الفنلندي إنكارا ثلاثة أشهر في تصميم أصعب ألغاز سودوكو في العالم، ولها إجابة واحدة فقط. وقال إنكارا إن أسرع المفكرين وألمع العقول هم وحدهم القادرون على كسر هذه اللعبة.
اليوم، جاء في خبر من Tencent أن رجلاً عجوزًا صينيًا تمكن من كسر أصعب شبكة مكونة من تسعة مربعات في العالم في ثلاثة أيام، على الرغم من أن الرجل العجوز قام بتغيير رقم في النهاية، إلا أنه أثار اهتمامي وأراد حل المشكلة من خلال برنامج كمبيوتر، لذلك مكثت في السكن الجامعي لفترة ما بعد الظهر وتم حل المشكلة أخيرًا، وكان كود مصدر البرنامج كما يلي.
انسخ رمز الكود كما يلي:
رقم الحزمةلعبة؛
نقطة الطبقة العامة {
عمود خاص ؛//رقم السطر
صف int خاص؛//رقم العمود
علامة منطقية خاصة؛ // لم يتم تعيين صحيح.
قيمة كثافة العمليات الخاصة؛
// نقطة البناء
نقطة عامة (int col، int صف، علامة منطقية، قيمة int) {
ممتاز()؛
this.col = col;
this.row = صف؛
this.flag = flag;
this.value = value;
}
تغيير الفراغ العام () {
علم =!علم;
}
getFlag المنطقية العامة () {
علم العودة؛
}
كثافة العمليات العامة getValue() {
قيمة الإرجاع؛
}
مجموعة الفراغ العام (قيمة int) {
this.value = value;
}
يمكن منطقية عامة هنا (Point[][] pArr) {
boolean cb = canCol(pArr);
boolean cr = canRow(pArr);
boolean cminiArr = canMiniArr(pArr);
return cb && cr && cminiArr;
}
// الحكم على ما إذا كانت هناك نفس العناصر في الشبكة الصغيرة 3*3
منطقية خاصة canMiniArr(Point[][] pArr) {
int coltemp = this.col % 3;
int Rowtemp = this.row % 3;
for (int i = this.col - coltemp; i < col + (3 - coltemp); i++) {
لـ (int j = this.row - Rowtemp; j < Row + (3 - Rowtemp); j++) {
إذا (i == this.col && j == this.row){
يكمل؛
}آخر{
if(this.value == pArr[i][j].getValue()){
عودة كاذبة.
}
}
}
}
عودة صحيحة؛
}
// تحديد ما إذا كانت هناك نفس العناصر في العمود
منطقية خاصة canRow(Point[][] pArr) {
لـ (int i = 0; i < 9; i++) {
إذا (i == this.col) {
يكمل؛
} آخر {
إذا (this.value == pArr[i][this.row].value) {// يتغير الصف، ويظل العمود بدون تغيير
عودة كاذبة.
}
}
}
عودة صحيحة؛
}
// تحديد ما إذا كانت هناك نفس العناصر في الصف
منطقية خاصة canCol(Point[][] pArr) {
لـ (int i = 0; i < 9; i++) {
إذا (أنا == هذا الصف) {
يكمل؛
} آخر {
إذا (this.value == pArr[this.col][i].value) {// حواف العمود، لم تتغير الصفوف
عودة كاذبة.
}
}
}
عودة صحيحة؛
}
}
- رمز نسخة البرنامج الرئيسي هو كما يلي:
رقم الحزمةلعبة؛
import java.io.BufferedReader;
import java.io.IOException;
استيراد java.io.InputStreamReader؛
import java.util.ArrayList;
رقم الفئة العامة 99 {
public static void main(String[] args) يلقي IOException{
Point[][] numMat = new Point[9][9];
ArrayList<Point> al = new ArrayList<Point>();
initNumMat(numMat,al);
setNum(numMat,al);
printMat(numMat);
}
مجموعة باطلة ثابتة خاصة (Point[][] numMat,ArrayList<Point> al) {
كثافة العمليات ط = 0؛
كثافة العمليات ي = 0;
يفعل{
إذا (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v <= 9; v++) {// أضف واحدًا إلى قيمة الموضع الذي تم إرجاعه إليه.
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {// تم استيفاء الشروط وعدم وجود تعارض.
numMat[i][j].changeFlag();// قم بتغيير العلامة إلى خطأ. يشير إلى أنه تم تعيينه.
استراحة؛
}else{// لا يفي بأي شرط، يتعارض. تزيد قيمة القيمة نفسها مرة واحدة
}
while(v == 9){// إذا لم يتمكن 1-9 من تلبية المتطلبات، فأعد تعيين موضع المنزل إلى 0 أولاً، وارجع مسافة واحدة، وأضف واحدة إلى قيمة الموضع الذي تم إرجاعه (عندما يكون الموضع الذي تم إرجاعه هو متى القيمة ليست 9، ومن المؤكد أن الموضع الذي تم إرجاعه ليس هو النقطة الأصلية لشبكة Jiugong).
numMat[i][j].setValue(0);
ي--؛
إذا (ي==-1){
ط--;ي=8;
}
while(al.contains(numMat[i][j])){// إذا كان الموضع الذي تم إرجاعه هو النقطة الأصلية لشبكة Jiugong، فاستمر في التراجع حتى لا تصبح النقطة الخاصة بك واقفز خارج while.
ي--؛
إذا (ي==-1){
ط--;ي=8;
}
}
numMat[i][j].changeFlag();// سيتم وضع علامة
v = numMat[i][j].getValue();
}
}
}
ي++;
إذا (ي==9){
j=0;i++;//i++ هنا قد يتسبب في زيادة i إلى 9، لذا فإن الحكم التالي يتطلب i!=9
}
إذا (أنا! = 9) {
while(al.contains(numMat[i][j])){
ي++;
إذا (ي==9){
ي=0;i++;
}
}
}
}while(i!=9);
}
initNumMat باطلة ثابتة عامة (Point[]] numMat,ArrayList<Point> al) throws IOException {
لـ (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);
}
initNumMat2 static void العام (Point[][] numMat, ArrayList<Point> al) يلقي IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] p = new String[3];
خط السلسلة = فارغ؛
System.out.println("الرجاء إدخال معلومات النقطة وفقًا للتنسيق (رقم الصف i ورقم العمود j وقيمة v)، أدخل عبر: ijv");
while((line = br.readLine())!=null){
إذا (line.equals("أكثر"))
استراحة؛
ع = 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])]);
}
}
طباعة الفراغ الثابت العام (Point[][] numMat) {
System.out.println("--------┬--------┬---------┐");
لـ (int i = 0; i < numMat.length; i++) {
for (int j = 0; j < numMat[i].length; j++) {
إذا ((ي + 1) % 3 == 0)
System.out.print(numMat[i][j].getValue() + " | ");
آخر
System.out.print(numMat[i][j].getValue() + " ");
}
إذا ((i + 1) % 3 == 0)
System.out.println("/r/n--------┼---------┼---------┤");
آخر
System.out.println();
}
}
}
--- قم بتشغيل البرنامج
يرجى إدخال معلومات النقطة وفقًا للتنسيق (رقم الصف i ورقم العمود j وقيمة v)، ثم أدخل: 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
زيادة
――┬―――┬―――┐
8 1 2 |. 7 5 3 |
9 4 3 |.6 8 2 |
6 7 5 |.4 9 1 |
――┼―――┼―――┤
1 5 4 |
3 6 9 |. 8 4 5 |
2 8 7 |.1 6 9 |
――┼―――┼―――┤
5 2 1 |.9 7 4 |
4 3 8 |
7 9 6 |.3 1 8 |
――┼―――┼―――┤