题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
#include <stdio.h>
int ccnt = 0;
int path[81][2];
void putinbuffer(int buffer[], int a[][9], int pattern, int row, int col) {
int block = row / 3 * 3 + col / 3;
if (pattern == 1) //row
for (int i = 0; i < 9; i++) {
if (a[row][i] != 0)
buffer[(a[row][i])-1] ++;
}
if (pattern == 2) { //col
for (int i = 0; i < 9; i++) {
if (a[i][col] != 0)
buffer[a[i][col]-1] ++;
}
}
if (pattern == 3) { //block
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (a[block /3 * 3 + i][block % 3* 3 + j] != 0)
buffer[a[block / 3 * 3 + i][block % 3 * 3 + j]-1]++;
}
}
}
}
void bufferclear(int buffer[]) {
for (int i = 0; i < 9; i++) {
buffer[i] = 0;
}
}
void get_usabledata(int a[][9], int row, int col, int data[]) {
int buff1[9]={0}, buff2[9]={0}, buff3[9]={0};
putinbuffer(buff1, a, 1, row, col);
putinbuffer(buff2, a, 2, row, col);
putinbuffer(buff3, a, 3, row, col);
int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt = 0;
int data1[9]={0};
int data2[9]={0};
int data3[9]={0};
for (int i = 0; i < 9; i++) {
if (buff1[i] == 0) {
data1[cnt1] = i+1;
cnt1++;
}
if (buff2[i] == 0) {
data2[cnt2] = i+1;
cnt2++;
}
if (buff3[i] == 0) {
data3[cnt3] = i+1;
cnt3++;
}
}
for (int cn1 = 0; cn1 <cnt1; cn1++) {
for (int cn2 = 0; cn2 <cnt2; cn2++) {
if (data1[cn1] == data2[cn2]) {
for (int cn3 = 0; cn3 < cnt3; cn3++) {
if (data1[cn1] == data3[cn3]) {
data[cnt] = data1[cn1];
//printf("%d ",data[cnt]);
cnt++;
break;
}
}
}
}
}
}
int check_mode(int a[][9], int row, int col) {
int data[9]={0};
for (int i = 1; i < 4; i++) {
bufferclear(data);
putinbuffer(data, a, i, row, col);
for (int j = 0; j < 9; j++) {
if (data[j] > 1)
return 0;
}
}
return 1;
}
int dfs(int b[][9], int c[][2], int d[][9], int point) {
//填入,检查
//如果检查ok,节点下一层,不ok,另外的参数填入
//如果该层所有参数都不通过,返回上层
int i = 0;
int dfstrue = 0;
while (d[point][i] != 0) {
b[c[point][0]][c[point][1]] = d[point][i];
if (check_mode(b, c[point][0], c[point][1]) == 1) {
path[point][0] = c[point][0];
path[point][1] = c[point][1];
if (point < (ccnt-1))
dfstrue = dfs(b, c, d, point + 1);
else
return 1;
if (dfstrue == 1)
return 1;
}
i++;
}
b[c[point][0]][c[point][1]] = 0;
return 0;
}
int main() {
int a[9][9];
int temp;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (scanf("%d ", &temp) != EOF)
a[i][j] = temp;
}
}
int c[81][2];
int d[81][9] = {0};
int data[9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
bufferclear(data);
if (a[i][j] == 0) {
c[ccnt][0] = i;
c[ccnt][1] = j;
get_usabledata(a, i, j, data);
for (int i = 0; i < 9; i++) {
if (data[i] > 0) {
d[ccnt][i] = data[i];
} else
break;
}
ccnt++;
}
}
}
int thetrue = dfs(a, c, d, 0);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}


