当前位置:首页 » 编程语言 » c语言数独编程思路
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言数独编程思路

发布时间: 2022-09-07 07:59:33

c语言 编程 数独

当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^

㈡ 如何C语言编写数独游戏

当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^

㈢ 基于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),也称行摒除法。

㈣ 谁能告诉我数独游戏的编程思维啊

一、解数独
1、标记
2、利用各种方法减少标记数量,例如显性数对删减法、隐形唯一数法、隐形数对法、区域删减法、区块删减法、三四链数删减法等等
3、填充,利用唯一值法,如果那个标记中只有一个可填了,这就是结果了。
4、假设法,如果各种方法(至少你知道的)都用了还是没有唯一数,那只能假设了,按一定顺序某个单元格标记中假设一个就是要填充的数,然后重复上面的步骤,如果得到无解(就是出现某个单元格的没有可填的数),那就退回,换一个数继续。(一般这个过程用递归完成)
二、如何生成题目
会解数独后,生成就不是问题了,我的方法是分为两步首先随机填充1-9到第一行,然后用上诉方法产生一个解。再次,随机一个一个数删除,每删除一个数重复上诉方法,看看是否是唯一解,如果是继续删除(不是就恢复,删其它的),直到达到一定目的为止。这样就产生一个数独题目。

㈤ 用c语言写一个简易数独的思路。要代码

#include<stdio.h>
intnum[9][9],xy[9][9];
intcheck(intx,inty){
inti,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))
return0;
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!=x&&n+i%3!=y)
return0;
return1;
}
voidsearch(intx,inty){
if(x==9)
for(x=0;x<9;x++){
for(y=0;y<9;y++)
printf("%d",xy[x][y]);
printf(" ");
}
elseif(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;
}
intmain(){
inti,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);
return0;
}

输入为9行9列整数,已知的整数填写对应的数字,尚待计算的未知数字填写0。

该代码的思路很简单,就是从第一行第一列开始依次填入数字,检查是否是在同一行、同一列、同一宫有没有填入重复数字,如果没有就继续填入下一个数字,如果有就返回。

虽然效率稍低,但原理简单、表述直白、易于理解,更有效率的代码是使用十字链表完成,如有兴趣可继续深入

㈥ 求助 c语言关于“数独”的思路 在线等啊!

1 2 3 4 5 6 7 8 9
2 1 4 5 6 7 8 9 3
3 4 5
4 5
5 6
6 7
7 8
8 9
9 3
这种情况,横竖都没问题,但是九宫格里重复了

㈦ C语言怎么实现解决一个数独啊~~菜鸟求C语言大神给代码和思路><~~好的给追加分!!

这是用递归方法写的代码
摘自http://blog.sina.com.cn/s/blog_61c5b01f0100nrta.html
我测试过一些案例
初始数据必须是正确的,一些极端情况会卡很久才有结果
一般能够很快给出所有解
#include<stdio.h>

int result=0; //结果数

int main()
{
int a[9][9];
void Sudoku(int a[9][9],int n);
printf("请输入数独中的原始数据,没有数据的用0代替。\n");
for(int i=0;i<9;i++)
{
printf("请输入第%d行的9个数:",i+1);
for(int j=0;j<9;j++)
scanf("%d",&a[i][j]);
}
printf("数独的解为:\n\n");
Sudoku(a,0);
if(result==0)
printf("此数独无解!");
return 0;
}

//输出可行的解
void print(int a[9][9])
{
result++;
printf("第%d个填法为:\n",result);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d ",a[i][j]);
if((j==2)||(j==5))
printf(" ");
}
printf("\n");
if((i==2)||(i==5))
printf("\n");
}
printf("\n");
}

//判断是否可以将第i行、第j列的数设为k
bool check(int a[9][9],int i,int j,int k)
{
int m,n;
//判断行
for(n=0;n<9;n++)
{
if(a[i][n] == k)
return false;
}
//判断列
for(m=0;m<9;m++)
{
if(a[m][j] == k)
return false;
}
//判断所在小九宫格
int t1=(i/3)*3,t2=(j/3)*3;
for(m=t1;m<t1+3;m++)
{
for(n=t2;n<t2+3;n++)
{
if(a[m][n] == k)
return false;
}
}
//可行,返回true
return true;
}

//数独求解函数
void Sudoku(int a[9][9],int n)
{
int temp[9][9];
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
temp[i][j]=a[i][j];
}
i=n/9; j=n%9; //求出第n个数的行数和列数
if(a[i][j] != 0) //已经有原始数据
{
if(n == 80) //是最后一个格子,输出可行解
print(temp);
else //不是最后一个格子,求下一个格子
Sudoku(temp,n+1);
}
else //没有数据
{
for(int k=1;k<=9;k++)
{
bool flag=check(temp,i,j,k);
if(flag) //第i行、第j列可以是k
{
temp[i][j]=k; //设为k
if(n == 80)
print(temp);
else
Sudoku(temp,n+1);
temp[i][j]=0; //恢复为0,判断下一个k
}
}
}
}

㈧ 用C语言怎么解数独

#include<stdio.h>
#include<stdlib.h>

#defineSIZE9
#defineget_low_bit(x)((~x&(x-1))+1)

struct{
intleft;
charnum;
chartry;
}board[SIZE][SIZE];

intbit2num(intbit)
{
switch(bit){
case1:case2:
returnbit;
case4:
return3;
case8:
return4;
case16:
return5;
case32:
return6;
case64:
return7;
case128:
return8;
case256:
return9;
}
}

voidprintf_res()
{
inti,j,k;

for(i=0;i<SIZE;i++)
{
if(i%3==0)
{
for(j=0;j<SIZE*2+4;j++)
putchar('-');
putchar(' ');
}

for(j=0;j<SIZE;j++)
{
if(j%3==0)
putchar('|');
if(board[i][j].num>0)
printf("33[0;31m%2d33[0m",board[i][j].num);
else
printf("%2d",board[i][j].try);
}
printf("| ");
}
for(i=0;i<SIZE*2+4;i++)
putchar('-');
putchar(' ');
}

voidsub(inti,intj,intbit)
{
intk,m;

for(k=0;k<SIZE;k++)
{
board[k][j].left&=~bit;
board[i][k].left&=~bit;
}

for(k=i/3*3;k<(i/3+1)*3;k++)
for(m=j/3*3;m<(j/3+1)*3;m++)
board[k][m].left&=~bit;
}

voidinit()
{
inti,j;

for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(board[i][j].num>0)
sub(i,j,1<<(board[i][j].num-1));
elseif(board[i][j].try>0)
sub(i,j,1<<(board[i][j].try-1));
}

voidadd(inti,intj,intbit)
{
intk,m;

for(k=0;k<SIZE;k++)
{
board[k][j].left|=bit;
board[i][k].left|=bit;
}
for(k=i/3*3;k<(i/3+1)*3;k++)
for(m=j/3*3;m<(j/3+1)*3;m++)
board[k][m].left|=bit;
}

voidsolve(intpos)
{
inti=pos/SIZE;
intj=pos%SIZE;
intbit,left;

if(pos==SIZE*SIZE)
{
printf_res();
exit(0);
}
if(board[i][j].num>0)
solve(pos+1);
else
for(left=board[i][j].left;left;left&=(left-1))
{
bit=get_low_bit(left);
sub(i,j,bit);
board[i][j].try=bit2num(bit);

solve(pos+1);

add(i,j,bit);
board[i][j].try=0;
init();
}
}

intmain()
{
inti,j,c;

for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
{
while((c=getchar())<'0'||c>'9')
;
board[i][j].num=c-'0';
board[i][j].try=0;
board[i][j].left=0x0001FF;
}
init();
solve(0);

return0;
}

㈨ 求大神赐我C语言编写“解数独”的思路咯喂

玩过数独都知道数独做起来本来就很复杂,特别是到了最后还要猜数,验证
你还在入门阶段就尝试这么复杂的问题真的很有挑战精神呢
机解数独的步骤:
建立一个数组
1:确定唯一数(没有集合做的很麻烦呢,不过笨办法还有有的,不详写),有些格子的数是唯一的,如果有唯一数,跳到第二步;
如果没有,则跳得到第三步;
2:将唯一数代入数组,跳到第一步;
3:做一个循环判定,如果是空位,确定数字的可能的情况(不详写),在做一个选择判断,
情况1:选择一个数字,跳到第一步;
情况2:选择第二个数字,跳到第一步;
........
分太少了,楼主好好努力吧

㈩ 求数独的编程思想

我用EXCEL的宏编过,但是算法不太好,简单得可以作出,难得的就不行了
想法如下:
建立一个X(a,b,c,d)的列阵,4个数为(1,2,3)中的一个
a,b表示大的33阵(就是你所说的"区")的位置
c,d表示在特定33阵(特定"区")中的位置
那么每个特定的X表示特定的空格位置
每个X初始都=123456789
X的值表示这个空格可能取的数
然后已经给出的条件的X改为条件给出的数
现在我虽然不知道剩下的空格是哪个数,但是我可以知道特定的空格中不可以是哪个数(按规则)
step1
所以分别检查每个空格
将不可能出现的数字从123456789中删去(比如这个区已经存在1,4,5那么我们把区中其他的空格的1,4,5去掉,变成2,3,6,7,8,9)
这样X的位数就越来越小了
当X的长度等于1的时候那么这个空格就是唯一的了
step2
检查每一个区中的9个数中含有几个1,如果只有1个,那么含有1的哪个空格就是1了,(1-9,依次检验),(行或者列也要分别检验)
step3
检查是不是每个数都小于10,如果不是
检查经过step1和step2后,各个数字有没有变化,如果有,那么重复step1,step2.没有的话(说明按刚刚的步骤只能解到这样了)结束循环
我编的只是为了方便帮我解题,太难的做不出,但是用的话可以解出很多数了,人在看一下,很快就解出了
如果一定要编到底的话,我也想过
然后在X中寻找1个2位数,假定2位数中的一个是正确的,然后在按刚刚的步骤,如果结果有矛盾则就是另一个数
希望对你有帮助