题解 | #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; }