>source

그래서 저는 스도쿠 솔버를 작성하는 것에 대한 컴퓨터 애호가 비디오를 따라 가고 있었고 파이썬에서 코드가 작동하도록 관리했습니다. 다음은 제가 얻은 것입니다.

def possible(grid, y, x, n):
for i in range(0,9):
    if grid[y][i] == n:
        return False
    if grid[i][x] == n:
        return False
x0 = (x//3)*3
y0 = (y//3)*3
for i in range(0,3):
    for j in range(0,3):
        if grid[y0+i][x0+j] == n:
            return False
return True
def solver(grid):
    for y in range(9):
        for x in range(9):
            if grid[y][x] == 0:
                for n in range(1,10):
                    if possible(grid, y, x, n):
                        grid[y][x] = n
                        solver(grid)
                        grid[y][x] = 0
                return
    print(np.matrix(grid))

이 코드는 제대로 작동합니다. 하지만 웹 애플리케이션에서이 작업을 수행하고 싶었으므로 다음과 같이 Javascript로 번역했습니다.

function possible(board, y, x, n) {
    for(i = 0; i < 9; i++) {
        if(board[y][i] === n) {
            return false;
        }
        if(board[i][x] === n) {
            return false;
        }
    }
    y0 = Math.floor(y/3)*3;
    x0 = Math.floor(x/3)*3;
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            if(board[i+y0][j+x0] === n) {
                return false;
            }
        }
    }
    return true;
} 
function solver(board) {
    for(y = 0; y < 9; y++) {
        for(x = 0; x < 9; x++) {
            if(board[y][x] === 0) {
                for(n = 1; n < 10; n++) {
                    if(possible(board, y, x, n)) {
                        board[y][x] = n;
                        solver(board);
                        board[y][x] = 0;
                    }
                }
                return;
            }
        }
    }
    console.log(board);
}

내가 볼 수있는 한, 이러한 함수는 정확히 동일하며 Python에서 작동하기 때문에 JavaScript에서 작동하지 않는 이유를 알 수 없습니다. JS에서는 console.log (board) 줄에 도달하지 않는 것 같아서 최대 재귀 깊이 또는 이와 같은 간단한 것에 도달하면 방황하고 있습니다.

참고로 다음은 Python 솔버에서 작동하는 그리드입니다.

grid = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
]

  • 답변 # 1

    함수 내에서 for 루프를 사용하는 경우 var 지역 변수를 생성하고 "no var"는 변수를 찾거나 전역 범위에 도달 할 때까지 범위 체인을 조회합니다. 선언해야 함을 의미합니다. var 하나의 루프가 다른 루프와 엉망이되는 것을 피하기 위해 for 루프 내부에 변수를 만들 때. 여기에서 더 많은 것을 읽으십시오

    따라서 코드는 다음과 같아야합니다.

    function possible(board, y, x, n) {
        for (var i = 0; i < 9; i++) {
            if (board[y][i] === n) {
                return false;
            }
            if (board[i][x] === n) {
                return false;
            }
        }
        y0 = Math.floor(y / 3) * 3;
      
        x0 = Math.floor(x / 3) * 3;
        for (var i = 0; i < 3; i++) {
            for (var j = 0; j < 3; j++) {
                if (board[y0+i][x0+j] === n) {
                    return false;
                }
            }
        }
        return true;
    }
    function solver(board) {
        for (var y = 0; y < 9; y++) {
            for (var x = 0; x < 9; x++) {
                if (board[y][x] === 0) {
                    for (var n = 1; n < 10; n++) {
                      
                        if (possible(board, y, x, n)) {
                            board[y][x] = n;
                            solver(board);
                            board[y][x] = 0; 
                        } 
                    }
                  return
                }
            }
        }
        console.log(board);
    }
    
    

  • 이전 flutter - 필요한 곳에 정확히 아이콘을 배치하기 위해 xy 그리드를 만드는 방법
  • 다음 sql - 조인을 사용하여 다른 열의 데이터로 테이블의 열 업데이트