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

数独c语言代码

发布时间: 2022-11-27 23:00:49

❶ 用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语言递归解数独

我从网上随便找个一个帮你改了改。首先把你要解的数独放入一个文件sudo_input里,和你编译后的exe文件在同一目录。内容为:

1 0 0 0

0 0 0 2

0 0 4 0

0 3 0 0

代码如下(备注:基本上这个也可以做9路甚至更多的,只需改动LENGTH和SUBLEN值即可):

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

#defineLENGTH4
#defineSUBLEN2

intanswer=0;

voidprintSudo(intarray[][LENGTH]){
printf(" ");
inti,j;
for(i=0;i<LENGTH;i++){
if((i+1)%SUBLEN==0)
printf(" ");
for(j=0;j<LENGTH;j++){
if((j+1)%SUBLEN==0)
printf(" ");
printf("%d",array[i][j]);
}
printf(" ");
}
exit(0);
}


voidinitSudoArray(intarray[][LENGTH]){
inti,j;
FILE*fp;

if((fp=fopen("sudo_input","r"))==NULL){
printf("Fileopenfailed! ");
exit(-1);
}

for(i=0;i<LENGTH;i++){
for(j=0;j<LENGTH;j++){
fscanf(fp,"%d",&array[i][j]);
}
}

fclose(fp);
}


intcheckSudo(intarray[][LENGTH],inti,intj,inttestVal){
introw,col;
printf("checkSudofor[%d][%d]testVal=%d ",i,j,testVal);

//fixedtocolj,checkfortherows
for(row=0;row<LENGTH;row++){
printf("checkforrows![%d][%d]=%d ",row,j,array[row][j]);
if(array[row][j]==testVal)
return0;
}


//fixedtorowi,checkforcols
for(col=0;col<LENGTH;col++){
printf("checkforcols![%d][%d]=%d ",i,col,array[i][col]);
if(array[i][col]==testVal)
return0;
}


//checkforthesub-square
introw_subSquare=(i/SUBLEN)*SUBLEN;
intcol_subSquare=(j/SUBLEN)*SUBLEN;


printf("[%d][%d] ",row,col);
for(row=row_subSquare;row<row_subSquare+SUBLEN;row++){
for(col=col_subSquare;col<col_subSquare+SUBLEN;col++){
printf("checkforsub-square![%d][%d]=%d ",row,col,array[row][col]);
if(array[row][col]==testVal)
return0;
}
}

return1;
}


//
voidsudo_solve(intarray[][LENGTH],intlength){
//iforrows,jforcols
inti,j;


inttestVal;
inttempArray[LENGTH][LENGTH];


//mpthearraytotempArray
for(i=0;i<LENGTH;i++){
for(j=0;j<LENGTH;j++)
tempArray[i][j]=array[i][j];
}


i=length/LENGTH;
j=length%LENGTH;


printf("array[%d][%d]=%d",i,j,array[i][j]);
if(array[i][j]!=0){
//thereisavalintheslotarray[i][j]
if(length==80)
printSudo(tempArray);
else
sudo_solve(tempArray,length+1);
}else{
//thereisnovalintheslotarray[i][j]
for(testVal=1;testVal<=LENGTH;testVal++){
if(checkSudo(tempArray,i,j,testVal)!=0){

tempArray[i][j]=testVal;

if(length==LENGTH*LENGTH-1)
printSudo(tempArray);
else
sudo_solve(tempArray,length+1);

tempArray[i][j]=0;
}
}
}
}


intmain(void){
intarray[LENGTH][LENGTH];
initSudoArray(array);

sudo_solve(array,0);

if(answer==0)
printf("Thereisnoanswerforthissudo!");

return0;
}

❸ c语言 编程 数独

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

❹ 求解数独题,用C语言实现

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。


#include<stdio.h>


intmap[9][9];


boolisPlace(intcount){

introw=count&#47;9;

intcol=count%9;

intj;

&#47;&#47;同一行

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

if(map[row][j]==map[row][col]&&j!=col){

returnfalse;

}

}

&#47;&#47;同一列

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

if(map[j][col]==map[row][col]&&j!=row){

returnfalse;

}

}

&#47;&#47;同一小格

inttempRow=row&#47;3*3;

inttempCol=col&#47;3*3;

for(j=tempRow;j<tempRow+3;++j){

for(intk=tempCol;k<tempCol+3;++k){

if(map[j][k]==map[row][col]&&j!=row&&k!=col){

returnfalse;

}

}

}

returntrue;

}


voidbacktrace(intcount){

if(count==81){

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

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

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

}

printf("&#92;n");

}

return;

}

introw=count&#47;9;

intcol=count%9;

if(map[row][col]==0){

for(inti=1;i<=9;++i){

map[row][col]=i;&#47;&#47;赋值

if(isPlace(count)){&#47;&#47;可以放

backtrace(count+1);&#47;&#47;进入下一层

}

}

map[row][col]=0;&#47;&#47;回溯

}else{

backtrace(count+1);

}

}


intmain()

{

charc;

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

{

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

{

scanf("%c",&c);

if(c=='.')map[i][j]=0;

elsemap[i][j]=c-'0';

}

scanf("%c",&c);&#47;&#47;接收换行符

}

backtrace(0);

return0;

}

❺ C语言数独问题,100分求教

花了点时间,总算写出来了,不知道和你要的意思一不一样,这次应该没问题了:

#include<stdio.h>

charFlag[2][9][9]={0};
charSu[3][3][3][3]={0};

introll(introw,intcol,inti,intj,charnum,inte){
printf(" 第%d行第%d列的%c不合理!",i+1,j+1,num);
switch(e){
case5:
printf("九宫格内数字重复");
break;
case7:
printf("数独行内数字重复");
break;
case9:
printf("数独列内数字重复");
break;
}
printf(" (回车键继续,任意字符回车退出):");
if(getchar()!=' '){
while(getchar()!=' ');
returne;
}

//清除整个数独行列标记
char(*unit)[3]=Su[row][col];
if(e>5){
//循环整个九宫格
while(i>=0){
//循环九宫格清除行列标记
while(--j>=0){
charc=unit[i][j]-'1';
e=row*3+i;
Flag[0][e][c]=0;
e=col*3+j;
Flag[1][e][c]=0;
}
j=3;
i--;
}
}

returnsd(row,col);
}

intsd(introw,intcol){
charnum,flag[9]={0};
char(*unit)[3]=Su[row][col];

inti,j,x;
statictip=1;
if(tip){tip=0;
printf("123 456 789 请按如上格式(下同)输入 ");
}
printf("第%d行第%d个九宫格: ",row+1,col+1);
scanf("%s %s %s",unit[0],unit[1],unit[2]);getchar();
printf("第%d行第%d个九宫格",row+1,col+1);

//循环整个九宫格
for(i=0;i<3;i++){
//循环九宫格每行是否合法
for(j=0;j<3;j++){
num=unit[i][j];
if(num<'1'||num>'9'){
printf(" 只能输入1-9的数字!");
returnroll(row,col,i,j,num,1);
}
//判断数独单元是否合理
if(flag[num-'1']){
returnroll(row,col,i,j,num,5);
}else{
flag[num-'1']=1;
}
//判断整个数独中单元所在行是否合理
x=row*3+i;
if(Flag[0][x][num-'1']){
returnroll(row,col,i,j,num,7);
}else{
Flag[0][x][num-'1']=1;
}
//判断整个数独中单元所在列是否合理
x=col*3+j;
if(Flag[1][x][num-'1']){
returnroll(row,col,i,j,num,9);
}else{
Flag[1][x][num-'1']=1;
}
}
}
printf("输入完成 ");
return0;
}

intmain(){
inti,j;
intx,y;
//循环整个数独
for(i=0;i<3;i++){
//循环每行数独九宫格
for(j=0;j<3;j++){
//数独九宫格输入和测试
if(x=sd(i,j)){
returnx;
}
}
}

printf(" 输入全部通过");
printf(" 完整的数独如下:");
//循环输出整个数独
for(x=0;x<3;x++){
printf(" ");
//循环九宫格一列
for(i=0;i<3;i++){
//输出数独一整行
for(y=0;y<3;y++){
//输出九宫格一行
for(j=0;j<3;j++){
printf("%c",Su[x][y][i][j]);
}
printf("");
}
printf(" ");
}
}
return0;
}

❻ 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;
}

❼ c++验证数独问题,求代码

把上述的数据存入文件,运行时从文件中读取:
#include<stdio.h>
#include<string.h>
inta[9][9];
intcheckAnswer()
{inti,j,s,b[10],i1,j1;
for(i=0;i<9;i++)
{memset(b,0,sizeof(b));
for(j=0;j<9;j++)
b[a[i][j]]=1;
for(j=s=0;j<10;j++)
s+=b[j];
if(s-9)return0;
}
for(i=0;i<9;i++)
{memset(b,0,sizeof(b));
for(j=0;j<9;j++)
b[a[j][i]]=1;
for(j=s=0;j<10;j++)
s+=b[j];
if(s-9)return0;
}
for(i=0;i<9;i+=3)
for(j=0;j<9;j+=3)
{memset(b,0,sizeof(b));
for(i1=0;i1<3;i1++)
for(j1=0;j1<3;j1++)
b[a[i+i1][j+j1]]=1;
for(j1=s=0;j1<10;j1++)
s+=b[j1];
if(s-9)return0;
}
return1;
}
intmain()
{intt,i,j;
FILE*fp;
if((fp=fopen("d:\0.txt","r"))==NULL)
{printf("Fileopenerror! ");
return0;
}
fscanf(fp,"%d",&t);
while(t--)
{for(i=0;i<9;i++)
for(j=0;j<9;j++)
fscanf(fp,"%d",&a[i][j]);
printf("%s ",checkAnswer()?"Yeah!":"Oh,No!");
}
fclose(fp);
return0;
}

❽ 基于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语言编一个解九宫格数独的程序

前两天刚写完,还没优化,已运行通过了.
晕,一维的好麻烦,这个也是碰巧前两天刚写好的,你看着自己修改下
#include <stdio.h>

typedef struct
{
int line;
int row;
int num;
}Node;

int main()
{
/*
int a[9][9]={
{4,0,3,6,0,0,0,0,0},
{0,0,0,0,0,1,0,2,4},
{0,1,0,0,4,0,5,0,0},
{0,0,0,9,0,4,0,6,0},
{3,0,2,0,0,0,4,0,9},
{0,7,4,1,0,3,0,0,0},
{0,0,1,0,9,0,0,4,0},
{2,4,0,3,0,0,0,0,0},
{0,0,0,4,0,8,2,0,7}};
*/
int a[9][9]={
{0,0,0,8,0,0,0,6,0},
{8,7,0,0,0,0,0,0,0},
{2,9,0,0,4,1,0,0,5},
{0,0,5,7,0,0,0,0,9},
{0,2,0,0,0,0,0,1,0},
{9,0,0,0,0,4,3,0,0},
{7,0,0,6,1,0,0,9,8},
{0,0,0,0,0,0,0,5,2},
{0,6,0,0,0,9,0,0,0}};
/*
int a[9][9]={
{0,2,0,0,6,0,0,0,0},
{0,9,0,4,0,5,1,3,0},
{0,0,8,7,0,0,0,0,5},
{6,0,0,3,0,0,4,0,0},
{0,0,0,9,0,6,0,0,0},
{0,0,7,0,0,1,0,0,3},
{4,0,0,0,0,7,3,0,0},
{0,8,5,2,0,4,0,7,0},
{0,0,0,0,9,0,0,1,0}};
*/
/*
int a[9][9]={
{0,0,3,0,2,0,0,0,6},
{0,0,2,0,9,0,0,0,4},
{7,0,0,8,0,0,2,0,3},
{0,8,0,0,7,0,5,0,0},
{0,7,0,1,0,6,0,3,0},
{0,0,0,2,0,0,0,9,0},
{4,0,6,0,0,8,0,0,5},
{6,0,0,0,4,0,3,0,0},
{9,0,0,0,1,0,7,0,0}};
*/
int i,j,n,en,flag,y,k=0,x,qu,p,q;
Node b[70];
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(!a[i][j])
{
b[k].line=i;
b[k].row=j;
b[k].num=0;
k+=1;
}
}
}
en=k;
/*从b[0]开始试,若b[k].num>9,则k-1,否则k+1*/
for(k=0;k<en;)
{
++b[k].num;
i=b[k].line;
j=b[k].row;
a[i][j]=b[k].num;
n=0;
while(n<9&&b[k].num<=9)
{
if(n==i)
{
for(y=0;y<9;y++)
{
if(y==j)
continue;
if(a[n][y]==a[i][j])
flag=1;
}
}
else if(n==j)
{
for(y=0;y<9;y++)
{
if(y==i)
continue;
if(a[y][n]==a[i][j])
flag=1;
}
}
/*判断同一块中有没有相同值*/
qu=3*(i/3)+j/3;
switch(qu)
{
case 0:x=0;
y=0;
break;
case 1:x=0;
y=3;
break;
case 2:x=0;
y=6;
break;
case 3:x=3;
y=0;
break;
case 4:x=3;
y=3;
break;
case 5:x=3;
y=6;
break;
case 6:x=6;
y=0;
break;
case 7:x=6;
y=3;
break;
default :x=6;
y=6;
break;
}
p=x;
q=y;
for(;x<p+3;x++)
{
for(;y<q+3;y++)
{
if(x==i&&y==j)
continue;
if(a[x][y]==a[i][j])
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
{
a[i][j]=++b[k].num;
flag=0;
n=0;
continue;
}
n++;
}
if(b[k].num>9)
{
a[i][j]=b[k].num=0;
k--;
if(k<0)
{
printf("error!\r\n");
return -1;
}
}
else
k++;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\r\n");
}
return 1;
}

热点内容
shell脚本文件路径 发布:2025-01-18 03:40:31 浏览:483
sql语句执行错误 发布:2025-01-18 03:21:49 浏览:651
数据库双引号 发布:2025-01-18 03:10:20 浏览:79
学java和php 发布:2025-01-18 03:01:03 浏览:452
怎么开服务器的端口 发布:2025-01-18 02:54:23 浏览:648
别克君越编程 发布:2025-01-18 02:32:24 浏览:914
ftp游戏下载网站 发布:2025-01-18 02:09:04 浏览:628
python调用另一个文件中的函数 发布:2025-01-18 02:03:54 浏览:597
mysql存储html 发布:2025-01-18 01:57:24 浏览:129
双ip服务器对网站优化有影响吗 发布:2025-01-18 01:56:41 浏览:246