핀란드의 수학자 잉카라(Inkara)는 세상에서 가장 어려운 스도쿠 퍼즐을 디자인하는 데 3개월을 보냈고, 그 퍼즐의 답은 단 하나였습니다. 잉카라는 가장 빠르게 생각하는 사람과 가장 똑똑한 마음만이 게임을 깨뜨릴 수 있다고 말했습니다.
오늘 텐센트에서 나온 소식에 따르면 중국 노인이 세상에서 가장 어려운 9제곱 격자를 3일 만에 깨뜨렸다고 합니다. 노인은 결국 숫자를 바꿨지만 관심을 불러일으키고 문제를 해결하고 싶었다고 합니다. 컴퓨터 프로그램이 있어서 오후에 기숙사에 머물다가 드디어 해결했습니다. 프로그램 소스코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 번호게임;
공개 클래스 포인트 {
private int col;//줄번호
개인용 int 행;//열 번호
private boolean 플래그; // True가 설정되지 않았습니다.
비공개 int 값;
//구성점
public Point(int col, int 행, 부울 플래그, int 값) {
감독자();
this.col = 열;
this.row = 행;
this.flag = 플래그;
this.value = 값;
}
공개 무효 변경 플래그() {
플래그 =!플래그;
}
공개 부울 getFlag() {
반환 플래그;
}
공개 int getValue() {
반환값;
}
공개 무효 setValue(int 값) {
this.value = 값;
}
공개 부울 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) {
for (int i = 0; i < 9; i++) {
if (i == this.col) {
계속하다;
} 또 다른 {
if (this.value == pArr[i][this.row].value) {//행이 변경되고 열은 변경되지 않고 유지됩니다.
거짓을 반환;
}
}
}
사실을 반환;
}
// 행에 동일한 요소가 있는지 확인
개인 부울 canCol(Point[][] pArr) {
for (int i = 0; i < 9; i++) {
if (i == this.row) {
계속하다;
} 또 다른 {
if (this.value == pArr[this.col][i].value) {//열 가장자리, 행은 변경되지 않음
거짓을 반환;
}
}
}
사실을 반환;
}
}
―메인 프로그램 복사 코드는 다음과 같습니다.
패키지 번호Game;
import java.io.BufferedReader;
import java.io.IOException;
import 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);
}
개인 정적 무효 setNum(Point[][] numMat,ArrayList<Point> al) {
int i = 0;
정수 j = 0;
하다{
if (numMat[i][j].getFlag()) {
for (int v = numMat[i][j].getValue()+1; v <= 9; v++) {//반환된 위치의 값에 1을 더합니다.
numMat[i][j].setValue(v);
if (numMat[i][j].canHere(numMat)) {//조건이 충족되고 충돌이 없습니다.
numMat[i][j].changeFlag();//플래그를 false로 변경합니다. 설정되었음을 나타냅니다.
부서지다;
}else{//조건이 충족되지 않으면 충돌합니다. 값 값은 한 번 증가합니다.
}
while(v == 9){//1-9가 요구 사항을 충족할 수 없는 경우 먼저 home 위치를 0으로 재설정하고 한 칸 뒤로 돌아가 반환된 위치 값에 1을 추가합니다(반환 위치가 When인 경우). 값이 9가 아닌 경우 반환된 위치가 Jiugong 그리드의 원래 지점이 아니라는 것이 보장됩니다.
numMat[i][j].setValue(0);
j--;
if(j==-1){
i--;j=8;
}
while(al.contains(numMat[i][j])){//반환된 위치가 구공 그리드의 원점이라면 자신의 점이 아닐 때까지 계속 후퇴한 후 while에서 뛰어내린다.
j--;
if(j==-1){
i--;j=8;
}
}
numMat[i][j].changeFlag();//표시할 것입니다.
v = numMat[i][j].getValue();
}
}
}
j++;
if(j==9){
j=0;i++;//i++ 여기서 i는 9로 증가할 수 있으므로 다음 판단에서는 i!=9가 필요합니다.
}
if(i!=9){
while(al.contains(numMat[i][j])){
j++;
if(j==9){
j=0;i++;
}
}
}
}동안(i!=9);
}
public static void initNumMat(Point[][] numMat,ArrayList<Point> al) throws 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) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
문자열[] p = 새로운 문자열[3];
문자열 라인=null;
System.out.println("형식(i 행 번호, j 열 번호 및 v 값)에 따라 포인트 정보를 입력하세요. 위에 입력하세요: ijv ");
while((line = br.readLine())!=null){
if(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])]);
}
}
공공 정적 무효 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() + " | ");
또 다른
System.out.print(numMat[i][j].getValue() + " ");
}
if ((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 | 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 |
――┼―――┼―――┤