当前位置:首页 » 编程语言 » 数独c语言

数独c语言

发布时间: 2024-04-24 11:05:10

A. 用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。

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

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

B. 数独 算法 C语言 代码

一、步骤:
1.对每一个空格,根据规则推断它可能填入的数字,并存储它的所有可能值;
2.根据可能值的个数,确定填写的顺序。比如说,有些空格只有一种可能,那必然是正确的结果,首先填入。
3.将所有只有一种可能的空格填写完毕以后,回到步骤1,重新确定剩下空格的可能值;
4.当没有只有一种可能的空格时(即每个空格都有两种以上可能),按照可能值个数从小到大的顺序,使用深度(广度)优先搜索,完成剩下空格。

二、例程:

#include<windows.h>
#include<stdio.h>
#include<time.h>

charsd[81];
boolisok=false;

//显示数独
voidshow()
{
if(isok)puts("求解完成");
elseputs("初始化完成");

for(inti=0;i<81;i++)
{
putchar(sd[i]+'0');
if((i+1)%9==0)putchar(' ');
}
putchar(' ');
}

//读取数独
boolInit()
{
FILE*fp=fopen("in.txt","rb");
if(fp==NULL)returnfalse;
fread(sd,81,1,fp);
fclose(fp);
for(inti=0;i<81;i++)
{
if(sd[i]>='1'&&sd[i]<='9')sd[i]-='0';
elsesd[i]=0;
}
show();
returntrue;
}

//递归解决数独
voidforce(intk)
{
if(isok)return;
if(!sd[k])
{
for(intm=1;m<=9;m++)
{
boolmm=true;
for(intn=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);
}
}

intmain()
{
system("CLS");
if(Init())
{
doublestart=clock();
force(0);
printf("耗时%.0fms",clock()-start);
}
elseputs("初始化错误");
getchar();
}

C. 用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;
}

D. 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();
}

E. C语言编写一个3*3数独,保证每行每列的和都相等!!求求各位大神了

/*
因为你说是数独可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)
结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断然后输出就是要的结果!
*/
#include<stdio.h>
#include<memory.h>
#include<stdbool.h>
//stack
inta[9]={0};//a[0]--a[0][0]a[1]--a[0][1]andsoonsimulatestack
intlen=0;
//dfs
intvisited[10]={0};
booljudge()//行列相等
{
inti,j;
inttmp[6]={0};
for(i=0;i<3;i++)
for(j=0;j<3;j++)
tmp[i]+=a[3*i+j];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
tmp[3+i]+=a[i+3*j];
intjud=tmp[0];
for(i=1;i<6;i++)
{
if(jud!=tmp[i])
returnfalse;
}
returntrue;
}
booljudge1()//行列相等对角线也相等
{
inti,j;
inttmp[8]={0};
for(i=0;i<3;i++)
for(j=0;j<3;j++)
tmp[i]+=a[3*i+j];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
tmp[3+i]+=a[i+3*j];
tmp[7]=a[0]+a[4]+a[8];
tmp[6]=a[2]+a[4]+a[6];
intjud=tmp[0];
for(i=1;i<8;i++)
{
if(jud!=tmp[i])
returnfalse;
}
returntrue;
}
voidprinta()
{
intt,p;
for(t=0;t<3;t++)
{
for(p=0;p<3;p++)
{
printf("%d",a[3*t+p]);
}
printf(" ");
}
}
voiddfs(inti,intv[])
{
if(i==10)//findonesolution
{
if(judge1())//给你写了两个判断函数如果对角线也相等那么用judge1()即可判断
printa();
return;
}

intj;
for(j=1;j<=9;j++)
{
inttmp[10];
memcpy(tmp,v,10*sizeof(int));
if(tmp[j]==0)
{
tmp[j]=1;
a[len++]=j;
//printf("%d%d ",len-1,a[len-1]);
dfs(i+1,tmp);
len--;
}

}


}
intmain(void)
{
dfs(1,visited);
return0;
}

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

G. 用C语言如何随机生成一个数独

数独生成算法?这个还真不好搞,不过我当初写数独游戏的时候随便捣鼓出来过一个,你自己去改改吧,至于这个算法能不能生成所有的数独,我还真没论证过。

原理:对一个给出的数独棋盘的所有行或列交换给出的两个数X、Y,或液数组仍满足数独规则。如给出1、2,则对所有列交换1、2的位置,数组仍满足数独规则。

由于对棋盘的演进是随机的,所以相当于随机生携正成数独棋盘啦。每衫隐物次演进的次数最好大一点,10次以上吧,以保证每个数都被换过位置。

具体代码就不用我写了吧,嘎嘎……

热点内容
两路服务器是什么意思 发布:2024-11-28 03:39:39 浏览:936
sql精简版64 发布:2024-11-28 03:36:28 浏览:72
金立怎么加密图片 发布:2024-11-28 03:31:43 浏览:663
2017玩dnf电脑什么配置 发布:2024-11-28 03:30:56 浏览:519
ftp挂载存储ip配置 发布:2024-11-28 03:28:51 浏览:962
山耐斯空压机密码多少 发布:2024-11-28 03:26:28 浏览:404
安卓拍照摇一摇是什么软件 发布:2024-11-28 03:26:27 浏览:256
小米2s存储卡 发布:2024-11-28 03:15:49 浏览:648
弹性算法 发布:2024-11-28 02:58:40 浏览:85
python写入mysql数据库 发布:2024-11-28 02:52:56 浏览:431