本篇文章给大家谈谈c语言程序设计数独,以及使用c语言编写数独游戏程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、c语言 编程 数独2、用c语言写一个简易数独的思路。要代码3、基于SAT的数独游戏求解程序,求C语言代码4、c语言编写的解数独程序
c语言 编程 数独
当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^
用c语言写一个简易数独的思路。要代码
#includestdio.h
int num[9][9], xy[9][9];
int check(int x, int y) {
int i, m, n;
for(i = 0; i 9; i++)
if ((xy[x][y] == xy[i][y]i != x)||(xy[x][y] == xy[x][i]i != y))
return 0;
for(i = 0, m = x / 3 * 3, n = y / 3 * 3; i 9; i++)
if (xy[x][y] == xy[m + i / 3][n + i % 3]m + i / 3 != xn + i % 3 != y)
return 0;
return 1;
}
void search(int x, int y) {
if (x == 9)
for(x = 0; x 9; x++) {
for(y = 0; y 9; y++)
printf(“%d “, xy[x][y]);
printf(“\n”);
}
else if (num[x][y])
search(x + (y + 1) / 9, (y + 1) % 9);
else
for(xy[x][y] = 1; xy[x][y] = 9; xy[x][y]++)
if (check(x, y))
search(x + (y + 1) / 9, (y + 1) % 9);
return;
}
int main() {
int i, j;
for(i = 0; i 9; i++)
for(j = 0; j 9; j++) {
scanf(“%d”, num[i][j]);
xy[i][j] = num[i][j];
}
search(0, 0);
return 0;
}
输入为9行9列整数,已知的整数填写对应的数字,尚待计算的未知数字填写0。
该代码的思路很简单,就是从第一行第一列开始依次填入数字,检查是否是在同一行、同一列、同一宫有没有填入重复数字,如果没有就继续填入下一个数字,如果有就返回。
虽然效率稍低,但原理简单、表述直白、易于理解,更有效率的代码是使用十字链表完成,如有兴趣可继续深入
基于SAT的数独游戏求解程序,求C语言代码
用0代表要填的数
#include stdio.h
#include stdlib.h
#define SIZE 9
#define get_low_bit(x) ((~x(x-1))+1)
struct{
int left;
char num;
char try;
}board[SIZE][SIZE];
int bit2num(int bit)
{
switch(bit){
case 16:
case 256:
return 9;
基础解法
排除法(摒除法)
摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为排除法 (Hidden Single)。
根据不同的作用范围,摒余解可分为下述三种:
数字可填唯一空格在「宫」单元称为宫排除(Hidden Single in Box),也称宫摒除法。
数字可填唯一空格在「行」单元称为行排除法(Hidden Single in Row),也称行摒除法。
c语言编写的解数独程序
#include windows.h
#include stdio.h
#include time.h
char sd[81];
bool isok = false;
//显示数独
void show()
{
if (isok) puts(“求解完成”);
else puts(“初始化完成”);
for (int i = 0; i 81; i++)
{
putchar(sd[i] + ‘0’);
if ((i + 1) % 9 == 0) putchar(‘\n’);
}
putchar(‘\n’);
}
//读取数独
bool Init()
{
FILE *fp = fopen(“in.txt”, “rb”);
if (fp == NULL) return false;
fread(sd, 81, 1, fp);
fclose(fp);
for (int i = 0; i 81; i++)
{
if (sd[i] = ‘1’ sd[i] = ‘9’) sd[i] -= ‘0’;
else sd[i] = 0;
}
show();
return true;
}
//递归解决数独
void force(int k)
{
if (isok) return;
if (!sd[k])
{
for (int m = 1; m = 9; m++)
{
bool mm = true;
for (int n = 0; n 9; n++)
{
if ((m == sd[k/27*27+(k%9/3)*3+n+n/3*6]) || (m == sd[9*n+k%9]) || (m == sd[k/9*9+n]))
{
mm = false;
break;
}
}
if (mm)
{
sd[k] = m;
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
sd[k] = 0;
}
else
{
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
int main()
{
system(“CLS”);
if (Init())
{
double start = clock();
force(0);
printf(“耗时%.0fms”, clock() – start);
}
else puts(“初始化错误”);
getchar();
}
c语言程序设计数独的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于使用c语言编写数独游戏程序、c语言程序设计数独的信息别忘了在本站进行查找喔。