题解 | #Sudoku#
Sudoku
http://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
const rl = require('readline').createInterface({
input: process.stdin
})
let zeroMap = []
let line = 0
const ins = []
rl.on('line',data => {
const b = data.split(' ').map((v,i) => {
if(v === '0') zeroMap.push([line,i])
return Number(v)
})
ins.push(b)
line++
})
rl.on('close', () => {
getSurplus(0)
console.log(ins.map(v => v.join(' ')).join('\n'))
})
function getSurplus(index=0){
if(index >= zeroMap.length) return 1
const [i,j] = zeroMap[index]
const arr = getRelativeArr(i,j)
let arr1 = []
let usefulArr = []
for(let ii = 0; ii < arr.length; ii++){
const arr2 = getSurplusFromOneArr(arr[ii])
arr1.push(arr2)
}
for(let k = 0; k < arr1[0].length;k++){
if(arr1[1].includes(arr1[0][k]) && arr1[2].includes(arr1[0][k])) usefulArr.push(arr1[0][k])
}
if (usefulArr.length === 0) return 0
for (let iii = 0; iii < usefulArr.length; iii++) {
ins[i][j] = usefulArr[iii]
if( getSurplus(index+1) === 1) return 1
ins[i][j] = 0
}
return -1
}
function getSurplusFromOneArr(arr){
return [1,2,3,4,5,6,7,8,9].filter(v => !arr.includes(v))
}
function getRelativeArr(i,j){
const arr = []
const ii = [~~(i/3), i % 3]
const jj = [~~(j/3), j % 3]
for(let k = 0; k < 3; k++){
for(let kk = 0; kk < 3; kk++){
arr.push(ins[ii[0]*3+(ii[1]+k)%3][jj[0]*3+(jj[1]+kk)%3])
}
}
return [ins[i],ins.map(v => v[j]),arr]
}