用c语言解题的程序,C语言实现的数独解题程序

#include /*数独二维数组*/

int g_s[9][9] = {

{0,4,0,7,0,0,0,0,0},

{9,2,0,0,0,0,6,0,7},

{8,3,0,0,0,5,4,0,0},

{0,1,0,0,0,3,0,0,0},

{0,0,0,2,0,1,0,0,0},

{0,0,0,5,0,0,0,4,0},

{0,0,4,9,0,0,0,7,1},

{3,0,5,0,0,0,0,9,4},

{0,0,0,0,0,8,0,6,0}

};

/*打印当前数独状态*/

int prt()

{

int i = 0;

int j = 0;

for(i = 0;i < 9;i++)

{

for(j = 0;j < 9;j++)

{

printf("%d ",g_s[i][j]);

}

printf("\n");

}

getchar();

}

/*获取一个位置当前所有可能的解*/

int get_all_num(int i,int j,int a[9])

{

int s[9] = {1,2,3,4,5,6,7,8,9};

int row,col,k;

/*删除当前行中已出现的值*/

for(col = 0;col < 9;col++)

{

k = g_s[i][col];

if(k != 0)

{

s[k-1] = 0;

}

}

/*删除当前列中已出现的值*/

for(row = 0;row < 9;row++)

{

k = g_s[row][j];

if(k != 0)

{

s[k-1] = 0;

}

}

/*删除当前九宫格中已出现的值*/

row = (i/3)*3;

col = (j/3)*3;

for(i = row;i < (row+3);i++)

{

for(j = col;j < (col+3);j++)

{

k = g_s[i][j];

if(k != 0)

{

s[k-1] = 0;

}

}

}

i = 0;

for(k = 0;k < 9;k++)

{

if(s[k] != 0)

{

a[i] = s[k];

i++;

}

}

return i;

}

/*判断当前行是否合法*/

int check_row(int i,int num)

{

int j = 0;

for(j = 0;j < 9;j++)

{

if(g_s[i][j] == num)

{

return 0;

}

}

return 1;

}

/*判断当前列是否合法*/

int check_col(int j,int num)

{

int i = 0;

for(i = 0;i < 9;i++)

{

if(g_s[i][j] == num)

{

return 0;

}

}

return 1;

}

/*判断当前九宫格是否合法*/

int check_block(int i,int j,int num)

{

int row = (i/3)*3;

int col = (j/3)*3;

int k = 0;

int l = 0;

for(k = row;k < (row+3);k++)

{

for(l = col;l < (col+3);l++)

{

if(g_s[k][l] == num)

{

return 0;

}

}

}

return 1;

}

/*尝试一个解*/

int try_one(int i,int j,int num)

{

if(check_row(i,num) && check_col(j,num) &&

check_block(i,j,num))

{

g_s[i][j] = num;

//prt();

return 1;

}

return 0;

}

/*获取下一个要填空的位置*/

int get_next(int *pi,int *pj)

{

int i = *pi;

int j = *pj;

int r = i;

int c = 0;

j++;

for(;r < 9;r++)

{

for(c = j;c < 9;c++)

{

if(g_s[r][c] == 0)

{

*pi = r;

*pj = c;

return;

}

}

j = 0;

}

if(r == 9)

{

return 0;

}

*pi = r;

*pj = c;

return 1;

}

/*找到一个解*/

void finish()

{

printf("\n find a solution: \n");

prt();

}

/*处理一个位置*/

int do_one(int i,int j)

{

int row = i;

int col = j;

int n = 0;

int k = 0;

int a[9] = {0};

/*当前位置有解,下一个位置*/

if(g_s[row][col] != 0)

{

/*获取下一个无解的位置*/

if(get_next(&row,&col))

{

/*对一下个位置递归操作*/

do_one(row,col);

}

/*都有解了,成功*/

else

{

finish();

}

/*当前位置有解,直接回溯*/

return;

}

/*当前位置无解*/

else

{

/*获取当前位置的所有可能解*/

n = get_all_num(i,j,a);

for(k = 0;k < n;k++)

{

/*尝试所有可能的解,这里是重复操作,就不改了*/

if(try_one(i,j,a[k]))

{

row = i;

col = j;

/*此位置找到合适的了,下一个*/

if(get_next(&row,&col))

{

do_one(row,col);

}

/*当前位置已有解且没有下一个了,结束*/

else

{

finish();

}

}

}

/*要向前回溯,则这个位置找到的解无效,回溯前清0*/

g_s[i][j] = 0;

//prt();

return;

}

}

int main()

{

do_one(0,0);

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以为您提供一个简单的 C 语言代码来实现计算器。 以下是程序代码: ``` #include <stdio.h> #include <stdbool.h> #define N 9 bool isValid(int num, int x, int y, int sudoku[N][N]) { int row, col; for (row = 0; row < N; row++) if (sudoku[row][y] == num || sudoku[x][row] == num) return false; int sqrtN = (int) sqrt(N); int boxRowStart = x - x % sqrtN; int boxColStart = y - y % sqrtN; for (row = 0; row < sqrtN; row++) for (col = 0; col < sqrtN; col++) if (sudoku[boxRowStart + row][boxColStart + col] == num) return false; return true; } bool solveSudoku(int sudoku[N][N]) { int row, col; for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { if (sudoku[row][col] == 0) { for (int num = 1; num <= N; num++) { if (isValid(num, row, col, sudoku)) { sudoku[row][col] = num; if (solveSudoku(sudoku)) return true; sudoku[row][col] = 0; } } return false; } } } return true; } int main() { int sudoku[N][N]; int row, col; printf("请输入数,0表示未知数字:\n"); for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { scanf("%d", &sudoku[row][col]); } } if (solveSudoku(sudoku)) { printf("\n解决方案:\n"); for (row = 0; row < N; row++) { for (col = 0; col < N; col++) { printf("%d ", sudoku[row][col]); } printf("\n"); } } else { printf("\n无法解决数问题。\n"); } return 0; } ``` 该 ### 回答2: 数是一种数字逻辑谜题,目标是填充一个9x9的方格,使得每行、每列和每个3x3子方格内的数字都是1到9之间的唯一数字。为了编写一个数计算器程序,我们可以使用C语言实现。 首先,我们可以定义一个二维数组作为数的棋盘。每个元素代表一个方格,该方格上的数字可以是1到9之间的任何一个数字。我们可以使用0来表示空方格。 接下来,我们可以编写一个函数来验证给定的数字是否可以放置在给定的方格上。这个函数需要检查给定的数字是否在所在行、所在列和所在子方格内已经存在。如果数字不存在,那么该数字可以放置在对应的方格上。 然后,我们可以编写一个函数来解决数问题。该函数可以通过遍历棋盘中的每个方格,并尝试填充1到9之间的数字,来递归地寻找可行的解决方案。在每次尝试填充数字前,我们需要先调用验证函数来确认该数字是否可以放置在对应的方格上。如果遍历完所有的方格并找到解决方案,程序将输出这个解决方案。 最后,我们可以编写一个主函数来调用解决函数,并显示数的解决方案。在主函数中,我们可以先手动输入数的初始状态,然后调用解决函数来找到解决方案。如果找到了解决方案,程序将将其打印出来。如果没有找到解决方案,则可以输出一条消息提示数无解。 这就是一个简单的数计算器程序C语言实现。通过定义棋盘数组、编写验证函数和解决函数,并在主函数中调用它们,我们可以实现一个能够求解数问题的程序。 ### 回答3: 数计算器可以使用C语言编写,下面是一个简单的实现示例: ```c #include <stdio.h> #include <stdbool.h> // 定义数的大小为9x9的常量 #define SIZE 9 // 检查数字num是否在行row上已存在 bool isRowSafe(int puzzle[SIZE][SIZE], int row, int num) { for (int col = 0; col < SIZE; col++) { if (puzzle[row][col] == num) { return false; } } return true; } // 检查数字num是否在列col上已存在 bool isColSafe(int puzzle[SIZE][SIZE], int col, int num) { for (int row = 0; row < SIZE; row++) { if (puzzle[row][col] == num) { return false; } } return true; } // 检查数字num是否在9x9的子方格中已存在 bool isBoxSafe(int puzzle[SIZE][SIZE], int startRow, int startCol, int num) { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (puzzle[row + startRow][col + startCol] == num) { return false; } } } return true; } // 检查是否可以将数字num放置到指定位置(row, col) bool isSafe(int puzzle[SIZE][SIZE], int row, int col, int num) { return isRowSafe(puzzle, row, num) && isColSafe(puzzle, col, num) && isBoxSafe(puzzle, row - row % 3, col - col % 3, num); } // 查找未填数字的位置 bool findUnassignedLocation(int puzzle[SIZE][SIZE], int *row, int *col) { for (*row = 0; *row < SIZE; (*row)++) { for (*col = 0; *col < SIZE; (*col)++) { if (puzzle[*row][*col] == 0) { return true; } } } return false; } // 使用回溯法解决数 bool solveSudoku(int puzzle[SIZE][SIZE]) { int row, col; if (!findUnassignedLocation(puzzle, &row, &col)) { return true; // 所有位置已填满 } for (int num = 1; num <= SIZE; num++) { if (isSafe(puzzle, row, col, num)) { puzzle[row][col] = num; if (solveSudoku(puzzle)) { return true; } puzzle[row][col] = 0; // 撤销上一次的选择 } } return false; // 无解 } // 打印数 void printSudoku(int puzzle[SIZE][SIZE]) { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { printf("%d ", puzzle[row][col]); } printf("\n"); } } int main() { int puzzle[SIZE][SIZE] = { {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} }; if (solveSudoku(puzzle)) { printSudoku(puzzle); } else { printf("该数无解\n"); } return 0; } ``` 这个程序可以解决一个9x9的数问题,并在控制台上打印出结果。在该示例中,我们使用了回溯法来解决数问题。其中,`solveSudoku`函数递归地尝试所有可能的数字组合,并使用`isSafe`函数来检查每个数字在行、列、子方格中是否是唯一的。如果数有解,则在解决方案找到后,`printSudoku`函数会将答案打印出来。如果数无解,则会输出提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值