sudolu killer

来源:互联网 发布:内衣推荐知乎 编辑:程序博客网 时间:2024/05/01 05:39


思路:
        找到问号,判断哪个数字可以使用,即行列九宫格里 都没有出现过的数字就能用
        每个问号都可能有多种取值,找到一个符合的数字后,进入下个问号,这就相当于全排列:每个数字有多种取值,判断用没用过后就可以进入下一层
细节:1  因为这道题只要求输出一组数据所以找到第一组数据后,无需继续进行,return 就好,我用了count来计数,               当有了一组数据就将count 置1,返回上一层后,count还是1,于是就退回去了,不再搜了
          2   输入数独很是让我纠结,因为字符与字符之间有空格
               找到了3种方法,都可以   
                a:scanf("  %c",&ch);找个字符存值,并将其付给sudoku[i][j],注意格式串里的空格,可以强制忽略空白符
                b:scanf(“%c”,sudoku[i][j]);getchar();//getchar();可以吸收回车和空白符
                c:scanf(“%s”,temp);sudoku[i][j] = temp[0];用一个临时字符串保存,这里j的取值是0~8,因为                                   空格就是字符串结束
          3  如何判重,用了数组进行保存,分别是第几行的数字用没用,用了标记为1,没用过标记为0
int mark_row[10][10];int mark_col[10][10];int mark_jiu[4][4][10];
#include<stdio.h>#include<string.h>int count;//记录输出的个数,当已经有了一个输入就不需要继续搜索了int sudoku[10][10];int mark_row[10][10];//row[1]:numbers in row 1int mark_col[10][10];//col[1]:numbers in col 1int mark_jiu[4][4][10];typedef struct{int x, y;//记录问号的行列}node;node a[90];int k;//记录问号数组的长度void f(int level){//level:进入到了第几个问号int i, j;int x1, y1;if(level == k){//因为k的值是比问号多一个,所以level == k 就是访问完了所有数count = 1;for(i = 0; i < 9; i++){for(j = 0; j < 8; j++)printf("%d ", sudoku[i][j]);printf("%d\n", sudoku[i][8]);//最后一个值后面直接回车,没有空格}return;}//ifif(count == 1)return;else{for(i = 1; i < 10; i++){x1 = a[level].x;y1 = a[level].y;if(mark_row[x1][i] == 0 && mark_col[y1][i] == 0 && mark_jiu[x1/3][y1/3][i] == 0){//行列九宫格判断mark_row[x1][i] = 1 ;mark_col[y1][i] = 1 ;mark_jiu[x1/3][y1/3][i] = 1;sudoku[x1][y1] = i;f(level + 1);mark_row[x1][i] = 0;mark_col[y1][i] = 0;mark_jiu[x1/3][y1/3][i] = 0;}}}//else}int main(){int i, j;char ch;while(1){count = 0;k = 0;memset(mark_row, 0, sizeof(mark_row));memset(mark_col, 0, sizeof(mark_col));memset(mark_jiu, 0, sizeof(mark_jiu));for(i = 0; i < 9; i++)for(j = 0; j < 9; j++){if(scanf(" %c",&ch) == EOF)//强制忽略空白符读入字符return;if(ch == '?'){(a[k]).x = i;(a[k]).y = j;k++;}else{sudoku[i][j] = ch - '0';mark_row[i][ch - '0'] = 1;mark_col[j][ch - '0'] = 1;mark_jiu[i/3][j/3][ch - '0'] = 1;}}f(0);}return 0;}