Финский математик Инкара потратил три месяца на разработку самой сложной головоломки судоку в мире, и у нее есть только один ответ. Инкара сказал, что только самые быстрые и яркие умы смогут взломать игру.
Сегодня в новостях от Tencent говорилось, что китайский старик за три дня взломал самую сложную в мире сетку из девяти квадратов. Хотя старик в конце концов изменил число, это вызвало у меня интерес и захотелось решить проблему с помощью. компьютерную программу, поэтому я остался в общежитии на полдня и, наконец, решил ее. Исходный код программы следующий.
Скопируйте код кода следующим образом:
номер пакетаGame;
общественный класс Point {
Private int col;//номер строки
частная строка int; // номер столбца
частный логический флаг; // True не установлен.
частное целое значение;
//Точка строительства
public Point(int col, int row, boolean flag, int value) {
супер();
this.col = столбец;
this.row = строка;
this.flag = флаг;
это.значение = значение;
}
общественный недействительный ChangeFlag() {
флаг = !флаг;
}
общедоступное логическое значение getFlag() {
флаг возврата;
}
общественный int getValue() {
возвращаемое значение;
}
public void setValue (int value) {
это.значение = значение;
}
public boolean canHere(Point[][] pArr) {
логическое значение cb = canCol(pArr);
логическое значение cr = canRow(pArr);
логическое значение 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++) {
for (int j = this.row - rowtemp; j < row + (3 - rowtemp); j++) {
if(i == this.col && j == this.row){
продолжать;
}еще{
if(this.value == pArr[i][j].getValue()){
вернуть ложь;
}
}
}
}
вернуть истину;
}
// Определяем, есть ли в столбце одинаковые элементы
частное логическое значение canRow(Point[][] pArr) {
для (int я = 0; я <9; я++) {
если (я == this.col) {
продолжать;
} еще {
if (this.value == pArr[i][this.row].value) {//Строка меняется, столбец остаётся неизменным
вернуть ложь;
}
}
}
вернуть истину;
}
// Определяем, есть ли в строке одинаковые элементы
частное логическое значение canCol(Point[][] pArr) {
для (int я = 0; я <9; я++) {
если (я == this.row) {
продолжать;
} еще {
if (this.value == pArr[this.col][i].value) {//Ребра столбца, строки не изменены
вернуть ложь;
}
}
}
вернуть истину;
}
}
―Основной код копирования программы следующий:
номер пакетаGame;
импортировать java.io.BufferedReader;
импортировать java.io.IOException;
импортировать java.io.InputStreamReader;
импортировать java.util.ArrayList;
общественный класс Number99 {
public static void main(String[] args) выдает IOException{
Point[][] numMat = новая точка[9][9];
ArrayList<Point> al = новый ArrayList<Point>();
initNumMat(numMat,al);
setNum(numMat,al);
printMat(numMat);
}
Private static void setNum(Point[][] numMat,ArrayList<Point> al) {
интервал я = 0;
интервал j = 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();//Изменяем флаг на false. Указывает, что он установлен.
перерыв;
}else{//Условие не удовлетворяется, конфликт. Значение value увеличивается один раз.
}
while(v == 9){//Если 1–9 не может соответствовать требованиям, сначала сбросьте исходную позицию на 0, вернитесь на один пробел назад и добавьте единицу к значению возвращаемой позиции (когда возвращаемая позиция равна When значение не равно 9, гарантируется, что возвращаемая позиция не является исходной точкой сетки Цзюгун).
numMat[i][j].setValue(0);
дж--;
если(j==-1){
я--;j=8;
}
while(al.contains(numMat[i][j])){//Если возвращаемая позиция является исходной точкой сетки Цзюгун, продолжайте отступать, пока она не перестанет быть собственной точкой, и выпрыгните из while.
дж--;
если(j==-1){
я--;j=8;
}
}
numMat[i][j].changeFlag();//Отметим
v = numMat[i][j].getValue();
}
}
}
j++;
если(j==9){
j=0;i++;//i++ здесь может привести к увеличению i до 9, поэтому для следующего решения требуется i!=9
}
если(я!=9){
while(al.contains(numMat[i][j])){
j++;
если(j==9){
j=0;я++;
}
}
}
} Пока (я! = 9);
}
public static void initNumMat(Point[][] numMat,ArrayList<Point> al) бросает IOException {
for (int i = 0; i < numMat.length; i++) {
for (int j = 0; j < numMat[i].length; j++) {
numMat[i][j] = новая точка(i, j, true, 0);
}
}
initNumMat2 (numMat, al);
}
public static void initNumMat2(Point[][] numMat, ArrayList<Point> al) выдает IOException {
BufferedReader br = новый BufferedReader (новый InputStreamReader (System.in));
String[] p = новая строка[3];
Строковая линия = ноль;
System.out.println("Введите информацию о точке в соответствии с форматом (номер строки i, номер столбца j и значение v), введите поверх: ijv ");
while((line = br.readLine())!=null){
если(line.equals("более"))
перерыв;
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++) {
если ((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--------┼---------┼---------┤");
еще
Система.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 | 6 4 9 |
9 4 3 | 6 8 2 |
6 7 5 | 4 9 1 |
――┼―――┼―――┤
1 5 4 | 2 3 7 | 8 9 6 |
3 6 9 | 8 4 5 | 7 2 1 |
2 8 7 | 1 6 9 | 5 3 4 |
――┼―――┼―――┤
5 2 1 | 9 7 4 | 3 6 8 |
4 3 8 | 5 2 6 | 9 1 7 |
7 9 6 | 3 1 8 |
――┼―――┼―――┤