java实现9宫格及九宫格求解的程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for (int i1=0; i1<9; i1++)
{
for(int k2=0; k2<9; k2++)
{
System.out.print(g[i1][k2]+"\t");
}
System.out.println();
}
}
}
}
}
}
}
}
}
求解数独所有解(适合所有数独)的PASCAL程序
var a:packed array[1..9,1..9] of longint;
ll[i,j,ll[i,j,-1]]:=oo;
end;
end;
for i:=1 to n do
s[i]:=s1[n-i+1];
k:=1; i:=0;
t:=true;tt:=false;
whileiff do
begin
if t then
begin
for i:=ll[s[k,2],s[k,1],-1] downto 0 do
j++;
}
flag:for(int n=0; n<i;n++)
{
for(int m=0; m<9;m++)
{
while(g[i][m]==g[n][m])
{
i--;
break flag;
}
}
}
while(i==8)
{
flag0:for(int m=0; m<3; m++)
{
for(int n=0; n<3; n++)
{int i,j;
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void ini_logo(int logo[10][9][9],int arr[9][9]) /*初始化标志数组*/
{int i,j,k,p,r,s,t;
class jiugongjiuge
{
public static void main(String[] args)
{
int[][] g = new int[9][9];
boolean[][] bol = new boolean[9][10];//判断随机数是不是位0的数组
for(int i=0; i<9; i++)
xy[pa(s[k-1,2],s[k-1,1]),s[k-1,3]]:=true;
dec(k);
t:=false;
end;
end;
writeln(opo);
end.
求解数独的简单C语言程序(适合仅有唯一解的数独)/*数独求解*/
#include <stdio.h>
void print(int a[9][9]) /*格式化输出数独*/
int randomNum = new Double(a).intValue()%10;//随机产生的数字除以10取余数
if(bol[i][randomNum])//判断产生的随机数不是0
continue; //跳出这次的循环进行下次循环
g[i][k]=randomNum;
k++;
bol[i][randomNum]= true;
{int i,s,p,t;
arr[m][n]=k;
for(p=1;p<=9;++p)
logo[p][m][n]=1;
for(i=0;i<9;++i)
{logo[k][m][i]=1;
logo[k][i][n]=1;
}
for(s=(m/3)*3;s<(m/3)*3+3;++s)
for(t=(n/3)*3;t<(n/3)*3+3;++t)
if(bol[i][randomNum])//判断产生的随机数不是0
continue; //跳出这次的循环进行下次循环
g[i][k]=randomNum;
k++;
bol[i][randomNum]= true;
j++;
}
flag:for(int n=0; n<i;n++)
{
for(int m=0; m<9;m++)
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
for(k=1;k<=9;++k)logo[k][i][j]=1;
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
{p=arr[i][j];
for(r=0;r<9;++r)
y[j,ii]:=false;
xy[pa(i,j),ii]:=false;
end;
end;
for i:=1 to 9 do
for j:=1 to 9 do
begin
for oo:=1 to 9 do
if x[i,oo]and y[j,oo] and xy[pa(i,j),oo] then
begin
inc(ll[i,j,-1]);
repeat
dec(i);
until ((x[s[k,2],ll[s[k,2],s[k,1],i]]and y[s[k,1],ll[s[k,2],s[k,1],i]]) and xy[pa(s[k,2],s[k,1]),ll[s[k,2],s[k,1],i]])or (i<1);
end;
if i<1 then begin s[k,3]:=0; a[s[k,2],s[k,1]]:=0;
if (x[s[k,2],ll[s[k,2],s[k,1],i]]and y[s[k,1],ll[s[k,2],s[k,1],i]]) and xy[pa(s[k,2],s[k,1]),ll[s[k,2],s[k,1],i]] then
begin
t:=true;
break;
end;
end
else begin i:=s[k,4]; tt:=false;
{
i=0;
}
}
}
for (int i=0; i<9; i++)
{
{
for(int k=0; k<9; k++)
{
System.out.print(g[i][k]+"\t");
}
System.out.println();
}
}源自文库
}
}
可以看到错误结果的程序:
import java.util.Scanner;
fillchar(xy,sizeof(xy),true);
for i:=1 to 9 do
for j:=1 to 9 do
begin
read(ii);
a[i,j]:=ii;
if ii=0 then begin
inc(n);
s1[n,1]:=j;
s1[n,2]:=i;
end
else begin
x[i,ii]:=false;
dec(k); t:=false;i:=s[k,3]; x[s[k,2],i]:=true;y[s[k,1],i]:=true;//向上回溯
xy[pa(s[k,2],s[k,1]),i]:=true;
end
else t:=true;
if t then
begin
s[k,4]:=i;
s[k,3]:=ll[s[k,2],s[k,1],i];
{
for(int l=0; l<3; l++)
{
int sum2=0;
int sum1=0;
for(int k1=0; k1<3; k1++)
{
sum1+=g[3*m+k1][3*n+l];
}
sum2+=sum1;
if(sum2!=45)
{
i=-1;
System.out.println("此次产生的数组有错!");
java实现九宫图:
要求如下:
要求是横排,竖排,还有大九宫格中的9个《小九宫格》都是1-9各不相同。如图,图上已经给了几个数了。
没有循环输出的程序如下:
import java.util.Scanner;
class jiugongjiuge
{
public static void main(String[] args)
a[s[k,2],s[k,1]]:=s[k,3];
x[s[k,2],s[k,3]]:=false;
y[s[k,1],s[k,3]]:=false;
xy[pa(s[k,2],s[k,1]),s[k,3]]:=false;
inc(k);
end;
tt:=false;
if k>n then
begin
inc(opo);
{
while(g[i][m]==g[n][m])
{
i--;
break flag;
}
}
}
while(i==8)
{
int sum=0;
sum=g[0][0]+g[0][1]+g[0][2]+g[1][0]+g[1][1]+g[1][2]+g[2][0]+g[2][1]+g[2][2];
while(sum!=45)
{
int[][] g = new int[9][9];
boolean[][] bol = new boolean[9][10];//判断随机数是不是位0的数组
for(int i=0; i<9; i++)
{
int k=0;
for(int j=1;j<10;j++)
{
bol[i][j]=false; //第0个往后的都是0
bol[i][0]=true; //第0个是1
}
for (int j = 0; j < 9; )
{
double a = Math.random() * 10;
a = Math.ceil(a);
int randomNum = new Double(a).intValue()%10;//随机产生的数字除以10取余数
for (int i1=0; i1<9; i1++)
{
for(int k2=0; k2<9; k2++)
{
System.out.print(g[i1][k2]+"\t");
}
System.out.println();
}
break flag0;
}
else
{
System.out.println("此次产生的数组正确!");
var o,kk,jj,ii:longint;
begin
o:=choose2(i);
kk:=choose2(j);
case o of
1:jj:=0;
2:jj:=3;
3:jj:=6;
end;
exit(jj+kk);
end;
begin
fillchar(x,sizeof(x),true);
fillchar(y,sizeof(y),true);
i,j,k,p,l,m,n,ii,ans,mm,oo:longint;
s,s1:packed array[0..100,1..4] of longint;
x,y,xy:packed array[0..9,-1..9] of boolean; //横向,纵向,九宫的检验
t,tt,u:boolean;
opo:longint;
writeln(opo); // 计数器
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(a[i,j],' ');
writeln;
end;
writeln;
mm:=0;
x[s[k-1,2],s[k-1,3]]:=true;
y[s[k-1,1],s[k-1,3]]:=true;
begin
case x of
0..3:exit(1);
4..6:exit(2);
7..9:exit(3);
end;
end;
function iff:boolean; //搜索结束条件
begin
if (k<1) then exit(false)
else exit(true);
end;
function pa(i,j:longint):longint; //得到九宫格编号
logo[k][s][t]=1;
}
int check(int logo[10][9][9],int arr[9][9]) /*检测行列和小九宫格*/
ll:packed array[0..9,0..9,-1..11] of longint; //存储每个空格可能出现的数字 提高程序效率
function max(a,b:longint):longint;
begin
if b>a then exit(b)
else exit(a);
end;
function choose2(x:longint):longint;
{logo[p][i][r]=1;logo[p][r][j]=1;}
for(s=(i/3)*3;s<(i/3)*3+3;++s)
for(t=(j/3)*3;t<(j/3)*3+3;++t)
logo[p][s][t]=1;
}
}
int add(int arr[9][9],int logo[10][9][9],int m,int n,int k) /*arr[m][n]插入数字,修改arr,logo数组*/
{
int k=0;
for(int j=1;j<10;j++)
{
bol[i][j]=false; //第0个往后的都是0
bol[i][0]=true; //第0个是1
}
for (int j = 0; j < 9; )
{
double a = Math.random() * 10;
a = Math.ceil(a);
{
for(int k2=0; k2<9; k2++)
{
System.out.print(g[i1][k2]+"\t");
}
System.out.println();
}
}
}
}
}
}
}
}
}
求解数独所有解(适合所有数独)的PASCAL程序
var a:packed array[1..9,1..9] of longint;
ll[i,j,ll[i,j,-1]]:=oo;
end;
end;
for i:=1 to n do
s[i]:=s1[n-i+1];
k:=1; i:=0;
t:=true;tt:=false;
whileiff do
begin
if t then
begin
for i:=ll[s[k,2],s[k,1],-1] downto 0 do
j++;
}
flag:for(int n=0; n<i;n++)
{
for(int m=0; m<9;m++)
{
while(g[i][m]==g[n][m])
{
i--;
break flag;
}
}
}
while(i==8)
{
flag0:for(int m=0; m<3; m++)
{
for(int n=0; n<3; n++)
{int i,j;
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void ini_logo(int logo[10][9][9],int arr[9][9]) /*初始化标志数组*/
{int i,j,k,p,r,s,t;
class jiugongjiuge
{
public static void main(String[] args)
{
int[][] g = new int[9][9];
boolean[][] bol = new boolean[9][10];//判断随机数是不是位0的数组
for(int i=0; i<9; i++)
xy[pa(s[k-1,2],s[k-1,1]),s[k-1,3]]:=true;
dec(k);
t:=false;
end;
end;
writeln(opo);
end.
求解数独的简单C语言程序(适合仅有唯一解的数独)/*数独求解*/
#include <stdio.h>
void print(int a[9][9]) /*格式化输出数独*/
int randomNum = new Double(a).intValue()%10;//随机产生的数字除以10取余数
if(bol[i][randomNum])//判断产生的随机数不是0
continue; //跳出这次的循环进行下次循环
g[i][k]=randomNum;
k++;
bol[i][randomNum]= true;
{int i,s,p,t;
arr[m][n]=k;
for(p=1;p<=9;++p)
logo[p][m][n]=1;
for(i=0;i<9;++i)
{logo[k][m][i]=1;
logo[k][i][n]=1;
}
for(s=(m/3)*3;s<(m/3)*3+3;++s)
for(t=(n/3)*3;t<(n/3)*3+3;++t)
if(bol[i][randomNum])//判断产生的随机数不是0
continue; //跳出这次的循环进行下次循环
g[i][k]=randomNum;
k++;
bol[i][randomNum]= true;
j++;
}
flag:for(int n=0; n<i;n++)
{
for(int m=0; m<9;m++)
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
for(k=1;k<=9;++k)logo[k][i][j]=1;
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
{p=arr[i][j];
for(r=0;r<9;++r)
y[j,ii]:=false;
xy[pa(i,j),ii]:=false;
end;
end;
for i:=1 to 9 do
for j:=1 to 9 do
begin
for oo:=1 to 9 do
if x[i,oo]and y[j,oo] and xy[pa(i,j),oo] then
begin
inc(ll[i,j,-1]);
repeat
dec(i);
until ((x[s[k,2],ll[s[k,2],s[k,1],i]]and y[s[k,1],ll[s[k,2],s[k,1],i]]) and xy[pa(s[k,2],s[k,1]),ll[s[k,2],s[k,1],i]])or (i<1);
end;
if i<1 then begin s[k,3]:=0; a[s[k,2],s[k,1]]:=0;
if (x[s[k,2],ll[s[k,2],s[k,1],i]]and y[s[k,1],ll[s[k,2],s[k,1],i]]) and xy[pa(s[k,2],s[k,1]),ll[s[k,2],s[k,1],i]] then
begin
t:=true;
break;
end;
end
else begin i:=s[k,4]; tt:=false;
{
i=0;
}
}
}
for (int i=0; i<9; i++)
{
{
for(int k=0; k<9; k++)
{
System.out.print(g[i][k]+"\t");
}
System.out.println();
}
}源自文库
}
}
可以看到错误结果的程序:
import java.util.Scanner;
fillchar(xy,sizeof(xy),true);
for i:=1 to 9 do
for j:=1 to 9 do
begin
read(ii);
a[i,j]:=ii;
if ii=0 then begin
inc(n);
s1[n,1]:=j;
s1[n,2]:=i;
end
else begin
x[i,ii]:=false;
dec(k); t:=false;i:=s[k,3]; x[s[k,2],i]:=true;y[s[k,1],i]:=true;//向上回溯
xy[pa(s[k,2],s[k,1]),i]:=true;
end
else t:=true;
if t then
begin
s[k,4]:=i;
s[k,3]:=ll[s[k,2],s[k,1],i];
{
for(int l=0; l<3; l++)
{
int sum2=0;
int sum1=0;
for(int k1=0; k1<3; k1++)
{
sum1+=g[3*m+k1][3*n+l];
}
sum2+=sum1;
if(sum2!=45)
{
i=-1;
System.out.println("此次产生的数组有错!");
java实现九宫图:
要求如下:
要求是横排,竖排,还有大九宫格中的9个《小九宫格》都是1-9各不相同。如图,图上已经给了几个数了。
没有循环输出的程序如下:
import java.util.Scanner;
class jiugongjiuge
{
public static void main(String[] args)
a[s[k,2],s[k,1]]:=s[k,3];
x[s[k,2],s[k,3]]:=false;
y[s[k,1],s[k,3]]:=false;
xy[pa(s[k,2],s[k,1]),s[k,3]]:=false;
inc(k);
end;
tt:=false;
if k>n then
begin
inc(opo);
{
while(g[i][m]==g[n][m])
{
i--;
break flag;
}
}
}
while(i==8)
{
int sum=0;
sum=g[0][0]+g[0][1]+g[0][2]+g[1][0]+g[1][1]+g[1][2]+g[2][0]+g[2][1]+g[2][2];
while(sum!=45)
{
int[][] g = new int[9][9];
boolean[][] bol = new boolean[9][10];//判断随机数是不是位0的数组
for(int i=0; i<9; i++)
{
int k=0;
for(int j=1;j<10;j++)
{
bol[i][j]=false; //第0个往后的都是0
bol[i][0]=true; //第0个是1
}
for (int j = 0; j < 9; )
{
double a = Math.random() * 10;
a = Math.ceil(a);
int randomNum = new Double(a).intValue()%10;//随机产生的数字除以10取余数
for (int i1=0; i1<9; i1++)
{
for(int k2=0; k2<9; k2++)
{
System.out.print(g[i1][k2]+"\t");
}
System.out.println();
}
break flag0;
}
else
{
System.out.println("此次产生的数组正确!");
var o,kk,jj,ii:longint;
begin
o:=choose2(i);
kk:=choose2(j);
case o of
1:jj:=0;
2:jj:=3;
3:jj:=6;
end;
exit(jj+kk);
end;
begin
fillchar(x,sizeof(x),true);
fillchar(y,sizeof(y),true);
i,j,k,p,l,m,n,ii,ans,mm,oo:longint;
s,s1:packed array[0..100,1..4] of longint;
x,y,xy:packed array[0..9,-1..9] of boolean; //横向,纵向,九宫的检验
t,tt,u:boolean;
opo:longint;
writeln(opo); // 计数器
for i:=1 to 9 do
begin
for j:=1 to 9 do
write(a[i,j],' ');
writeln;
end;
writeln;
mm:=0;
x[s[k-1,2],s[k-1,3]]:=true;
y[s[k-1,1],s[k-1,3]]:=true;
begin
case x of
0..3:exit(1);
4..6:exit(2);
7..9:exit(3);
end;
end;
function iff:boolean; //搜索结束条件
begin
if (k<1) then exit(false)
else exit(true);
end;
function pa(i,j:longint):longint; //得到九宫格编号
logo[k][s][t]=1;
}
int check(int logo[10][9][9],int arr[9][9]) /*检测行列和小九宫格*/
ll:packed array[0..9,0..9,-1..11] of longint; //存储每个空格可能出现的数字 提高程序效率
function max(a,b:longint):longint;
begin
if b>a then exit(b)
else exit(a);
end;
function choose2(x:longint):longint;
{logo[p][i][r]=1;logo[p][r][j]=1;}
for(s=(i/3)*3;s<(i/3)*3+3;++s)
for(t=(j/3)*3;t<(j/3)*3+3;++t)
logo[p][s][t]=1;
}
}
int add(int arr[9][9],int logo[10][9][9],int m,int n,int k) /*arr[m][n]插入数字,修改arr,logo数组*/
{
int k=0;
for(int j=1;j<10;j++)
{
bol[i][j]=false; //第0个往后的都是0
bol[i][0]=true; //第0个是1
}
for (int j = 0; j < 9; )
{
double a = Math.random() * 10;
a = Math.ceil(a);