当前位置:首页 » 课程大全 » c语言数独课程设计

c语言数独课程设计

发布时间: 2021-02-13 18:43:38

A. 数独 算法 C语言 代码

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

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

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

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

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

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

E. 如何C语言编写数独游戏

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

F. c语言 编程 数独

#include<stdio.h>

/*数字0表示该位置为空,待填入数字
{0,0,4,6,0,2,0,9,1},
{2,1,0,9,8,4,0,5,6},
{9,0,0,0,7,1,4,2,0},
{1,2,5,0,6,0,3,4,7},
{4,7,6,0,0,0,9,8,5},
{8,3,9,0,4,0,1,6,2},
{0,9,1,2,5,0,0,0,4},
{5,8,0,4,1,6,0,3,9},
{6,4,0,3,0,7,5,0,0}};
*/

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

void input()
{
int i,j;
for(i = 0;i < 9;i++)
for(j = 0;j < 9;j++)
scanf("%d",&data[i][j]);
}

void output()
{
int i,j;
for(i = 0;i < 9;i++)
{
for(j = 0;j < 9;j++)
printf("%d ",data[i][j]);
printf("\n");
}
printf("\n");
}

/*检查num是否可放置在3*3区域是否有冲突*/
int CheckSquare(int line,int col,int num)
{
int i = (line / 3) * 3;
int j = (col / 3) * 3;
int m,n;
for(m = i;m < i + 3;m++)
for(n = j;n < j + 3;n++)
if((data[m][n] == num) && !(m == line && n == col))
return 0;
return 1;
}

/*检查行冲突*/
int CheckLine(int line,int col,int num)
{
int i = 9;
while(i--)
if((data[line][i] == num) && (i != col))
return 0;
return 1;
}

/*检查列冲突*/
int CheckColumn(int line,int col,int num)
{
int i = 9;
while(i--)
if((data[i][col] == num) && (i != line))
return 0;
return 1;
}

/*检查i行j列是否可放置num*/
int Check(int i,int j,int num)
{
return CheckSquare(i,j,num) && CheckLine(i,j,num) && CheckColumn(i,j,num);
}

/*检查是否完成*/
int IsDone()
{
int i,j;
for(i = 0;i < 9;i++)
for(j = 0;j < 9;j++)
if(!Check(i,j,data[i][j]) || (data[i][j] == 0))
return 0;
return 1;
}

void Calc()
{
int i,j,x;
if(IsDone())
{
output();
return;
}
for(i = 0;i < 9;i++)
{
for(j = 0;j < 9;j++)
{
if(data[i][j] == 0)
{
for(x = 1; x <= 9;x++)
{
if(Check(i,j,x))
{
data[i][j] = x;
Calc();
}
}
if(x == 10)
{
data[i][j] = 0;
return ;
}
}
}
}
}

int main()
{
// input();
Calc();
output();

return 0;
}

G. 数独 C语言思路

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

上面方法应该可以解决问题,
也可以这样改进:
第4步,使用深度优先搜索时,每确定一个空格填写后,回到执行步骤1。

说的有点乱,希望你能明白我的意思。如有需要解释的,发消息给我。谢谢

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

这个题目有点深奥,先占个座位,看看。
这个怎么觉得没有什么规则呢?你最好再用些语言说明一下。

I. C语言编程解数独不仅需要计算机自动求解,而且还提供自己填写的功能。程序越详细越好,感激!~

额,很简单,去官网去查吧

J. 怎么用C语言写数独程序

C 語言數獨解題程式原始碼動機 要如何寫個能解數獨的程式呢? 隨著數獨的風行,程式設計的老師常常以此為題,要求學生寫個解題的程式。 自數獨樂園開張以來,要求提供原始碼的要求就不曾斷過。 幫還是不幫好呢?幫了,好像在作弊,不幫又好像敝帚自珍,所以乾脆公開算了! 當然也有些人並不是為了寫作業,而是為了研究數獨,才提出此要求。這時如果能有個範例,提供一個初步的架構, 接下去的工作就簡單多了。 程式不使用任何技巧,完全採試誤法,有人會說:這樣做需要很長時間的試誤吧!程式的執行可以給你解答。 請編輯後,在命令列中將單列格式數獨放在參數中,只要有解,一定可獲得解答;如果是多重解,只解出一解就會停止。 例: sudoku 00480705203 C 語言原始碼 #include < stdio.h > #include < stdlib.h > int sudoku[81] ; // 數獨題目陣列 int tempNum[81] ; // 上一次填數位置 int tempSp= 0 ; // 上一次填數位置指標 int startH[81] ; // 列位置的起點 int startV[81] ; // 行位置的起點 int startB[81] ; // 九宮格位置的起點 int addH[9] ; // 列位置的加值 int addV[9] ; // 行位置的加值 int addB[9] ; // 九宮格位置的加值 int main(int argc, char *argv[]) { int j ; if(argc>1) for(j=0; j<81; j++) sudoku[j]= argv[1][j]-'0' ; else exit(0) ; printf( "------------------\n"); printSudoku(sudoku) ; init() ; // 參數設定 tryAns() ; // 測試求解 printf( "------------------\n"); printSudoku(sudoku) ; printf( "------------------\n"); } int init() { // 參數設定(設定這些參數之後,無論檢查行、列、九宮格都方便多了) int i ; for(i=0; i<81; i++) { startH[i]= i/9* 9 ; // 列位置的起點 startV[i]= i% 9 ; // 行位置的起點 startB[i]= ((i/9)/3)*27+ ((i%9)/3)*3 ; // 九宮格位置的起點 } for(i=0; i<9; i++) { addH[i]= i ; // 列位置的加值 addV[i]= i*9 ; // 行位置的加值 addB[i]= (i/3)*9+ (i%3) ; // 九宮格位置的加值 } } int printSudoku(int *prn) { // 印出數獨題目(陣列內容) int i ; for(i=0; i<81; i++) { printf( "%2d", prn[i]); if(i%9==8) printf("\n"); } } int tryAns() { // 測試求解 int sp=getNextBlank(-1) ; // 取得第一個空白的位置開始填入數字 do { sudoku[sp]++ ; // 將本位置數字加 1 if(sudoku[sp]>9) { // 如果本位置的數字已大於 9 時則回到上一個位置繼續測試 sudoku[sp]= 0 ; sp= pop() ; } else { if(check(sp)==0) { // 如果同行、列、九宮格都沒有相同的數字,則到下一個空白處繼續 push(sp) ; // 當然,如果發現有相同的數字時,就需把原位置的數字加 1(所以本處什麼都不做) sp= getNextBlank(sp) ; } } } while(sp>=0 && sp<81) ; } int getNextBlank(int sp) { // 取得下一個空白的位置 do { sp++ ; } while(sp<81 && sudoku[sp]>0) ; return(sp) ; } int check(int sp) { // 檢查同行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0 ; if(!fg) fg= check1(sp, startH[sp], addH) ; // 檢查同列有沒有相同的數字 if(!fg) fg= check1(sp, startV[sp], addV) ; // 檢查同行有沒有相同的數字 if(!fg) fg= check1(sp, startB[sp], addB) ; // 檢查同九宮格有沒有相同的數字 return(fg) ; } int check1(int sp, int start, int *addnum) { // 檢查指定的行、列、九宮格有沒有相同的數字,若有傳回 1 int fg= 0, i, sp1 ; for(i=0; i<9; i++) { sp1= start+ addnum[i] ; if(sp!=sp1 && sudoku[sp]==sudoku[sp1]) fg++ ; } return(fg) ; } int push(int sp) { // 將指定的位置放入堆疊中 tempNum[tempSp++]= sp ; } int pop() { // 取出堆疊中的上一個位置 if(tempSp<0) return(-1) ; else return(tempNum[--tempSp]) ; }

记得采纳啊

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919