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

c语言编写数独游戏

发布时间: 2022-04-21 16:06:35

❶ 如何用C++编写简单的数独程序

写了个c语言的,供楼主参考:难度可以通过int leave[3]={45,54,63};调整

/*******************************************************************************
suudookuu.c
*******************************************************************************/
#include <stdio.h>
#include <time.h>

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

char level[][8]={"EASY","NORMAL","HARD"};
int nlevel;

void display();
void make_sudoku();

int verify(int,int,int);

void main()
{
int i,j;
int nLeft=81;
int xPos,yPos,num;
char msg[128];
char ch;

do
{
system("cls");
printf("Game Level :\n");
printf(" [0] Easy\n");
printf(" [1] Normal\n");
printf(" [2] Hard\n");
printf("\nYour choice:");
scanf("%d",&nlevel);
} while(nlevel<0||nlevel>2);

make_sudoku(nlevel);

for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(Sudoku[i][j]) nLeft--;

strcpy(msg,"Good luch for you!");

while(nLeft)
{
system("cls");
printf("\nLevel: %s\n",level[nlevel]);
printf("\n%s\n\n",msg);

display();

printf("Input <x,y,num> :");
scanf("%d,%d,%d",&xPos,&yPos,&num);

if(xPos==0 && yPos==0) break;

if(verify(xPos, yPos, num))
{
strcpy(msg,"Come on,BABY!");
nLeft--;
}
else
{
strcpy(msg,"input error:please try again!");
}
}
if(nLeft==0) printf("\n\nCongratulation!You are the No.1!\n");
else printf("\n\nSee you next time!\n");
getch();
}

void display()
{
int i,j;
printf("\n y 1 2 3.4 5 6.7 8 9.\n");
printf("x ...................\n");
for(i=0;i<9;i++)
{
printf("%d .", i+1);
for(j=0;j<9;j++)
{
if(Sudoku[i][j]>0 && Sudoku[i][j]<10)
printf("%d", Sudoku[i][j]);
else
printf(" ");
if(j%3==2) printf(".");
else printf(" ");
}
printf("\n");
if(i%3==2) printf(". ...................\n");
}
}

void make_sudoku(int nLevel)
{
int i,j,n;
int t;
int leave[3]={45,54,63};

srand(time(NULL));
for(n=0;n<10;n++)
{
i = rand()%3 * 3 + rand()%3;
for(j=0;j<9;j++)
{
t = Sudoku[i][j];
Sudoku[i][j] = Sudoku[i/3*3][j];
Sudoku[i/3*3][j] = t;
}

i = rand()%3 * 3 + rand()%3;
for(j=0;j<9;j++)
{
t = Sudoku[j][i];
Sudoku[j][i] = Sudoku[j][i/3*3];
Sudoku[j][i/3*3] = t;
}
}

n=0;
while(n<leave[nLevel])
{
t = rand()%81;
i=t/9;
j=t%9;
if(Sudoku[i][j])
{
Sudoku[i][j]=0;
n++;
}
}
}

int verify(int x,int y,int n)
{
int i,j,p,q;

if(x<0||x>8||y<0||y>8||n<1||n>9||Sudoku[x][y]) return 0;
for(i=0;i<9;i++) if(i!=x && Sudoku[i][y] == n) return 0;
for(j=0;j<9;j++) if(j!=y && Sudoku[x][j] == n) return 0;

p=x/3*3;
q=y/3*3;

for(i=p;i<p+3;i++)
for(j=q;j<q+3;j++)
if((i!=x||j!=y) && Sudoku[i][j]==n) return 0;

Sudoku[x][y]=n;
return 1;
}

❷ 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语言编写一个解数独的程序,急

用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 1:case 2:
return bit;
case 4:
return 3;
case 8:
return 4;
case 16:
return 5;
case 32:
return 6;
case 64:
return 7;
case 128:
return 8;
case 256:
return 9;
}
}

void printf_res()
{
int i, j, k;

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

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

void sub(int i, int j, int bit)
{
int k, 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;
}

void init()
{
int i, 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));
else if(board[i][j].try > 0)
sub(i, j, 1<<(board[i][j].try-1));
}

void add(int i, int j, int bit)
{
int k, 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;
}

void solve(int pos)
{
int i=pos/SIZE;
int j=pos%SIZE;
int bit, 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();
}
}

int main()
{
int i, 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);

return 0;
}

❹ 用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语言写数独程序

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]) ; }

记得采纳啊

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

这个还真不好搞,不过我当初写数独游戏的时候随便捣鼓出来过一个,你自己去改改吧,至于这个算法能不能生成所有的数独,我还真没论证过。原理:对一个给出的数独棋盘的所有行或列交换给出的两个数X、Y,数组仍满足数独规则。如给出1、2,则对所有列交换1、2的位置,数组仍满足数独规则。由于对棋盘的演进是随机的,所以相当于随机生成数独棋盘啦。每次演进的次数最好大一点,10次以上吧,以保证每个数都被换过位置。具体代码就不用我写了吧,嘎嘎……追问不用生成所有数独。。只要生成一个唯一解的就好。。。

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