重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,
新乡县网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司。
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标
2.需要10张图片,空白和9个数字
3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上
4.事先输入若干组数组A的值(每组81个数),作为题库
5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.
6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.
具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。
加油^^
#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; iSIZE; i++)
{
if(i%3==0)
{
for(j=0; jSIZE*2+4; j++)
putchar('-');
putchar('\n');
}
for(j=0; jSIZE; 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; iSIZE*2+4; i++)
putchar('-');
putchar('\n');
}
void sub(int i, int j, int bit)
{
int k, m;
for(k=0; kSIZE; 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; iSIZE; i++)
for(j=0; jSIZE; 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; kSIZE; 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; iSIZE; i++)
for(j=0; jSIZE; 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;
}
/*
因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)
结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断 然后输出就是要的结果!
*/
#includestdio.h
#includememory.h
#includestdbool.h
//stack
int a[9]={0};//a[0]--a[0][0] a[1]--a[0][1] and so on simulate stack
int len=0;
//dfs
int visited[10]={0};
bool judge()//行列相等
{
int i,j;
int tmp[6]={0};
for(i=0;i3;i++)
for(j=0;j3;j++)
tmp[i]+=a[3*i+j];
for(i=0;i3;i++)
for(j=0;j3;j++)
tmp[3+i]+=a[i+3*j];
int jud=tmp[0];
for(i=1;i6;i++)
{
if(jud!=tmp[i])
return false;
}
return true;
}
bool judge1()//行列相等 对角线也相等
{
int i,j;
int tmp[8]={0};
for(i=0;i3;i++)
for(j=0;j3;j++)
tmp[i]+=a[3*i+j];
for(i=0;i3;i++)
for(j=0;j3;j++)
tmp[3+i]+=a[i+3*j];
tmp[7]=a[0]+a[4]+a[8];
tmp[6]=a[2]+a[4]+a[6];
int jud=tmp[0];
for(i=1;i8;i++)
{
if(jud!=tmp[i])
return false;
}
return true;
}
void printa()
{
int t,p;
for(t=0;t3;t++)
{
for(p=0;p3;p++)
{
printf("%d ",a[3*t+p]);
}
printf("\n");
}
}
void dfs(int i,int v[])
{
if(i==10)//find one solution
{
if(judge1())//给你写了两个判断函数 如果对角线也相等那么用judge1()即可判断
printa();
return;
}
int j;
for(j=1;j=9;j++)
{
int tmp[10];
memcpy(tmp,v,10*sizeof(int));
if(tmp[j]==0)
{
tmp[j]=1;
a[len++]=j;
//printf("%d %d\n",len-1,a[len-1]);
dfs(i+1,tmp);
len--;
}
}
}
int main(void)
{
dfs(1,visited);
return 0;
}