九宫图JAVA实现
2011-09-21 21:17 | 作者:Administrator
public class Test9gongtu {
public static void main(String args[]){
int a[][]=new int[5][5];
for(int i=0 ;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
a[i][j]=0;
}
}
int i,j;
int n=5;
int per_i;
int per_j;
a[0][n/2]=1;
i=0;
j=n/2;
for(int k=2;k<=n*n;k++){
per_i=i;
per_j=j;
i--;
j++;
if(per_i==0){
i=n-1;
}
if(per_j==n-1){
j=0;
}
if(a[i][j]!=0){
i=per_i+1;
j=per_j;
a[i][j]=k;
}
if(a[i][j]==0){
a[i][j]=k;
}
}
for( i=0 ;i<a.length;i++){
for( j=0;j<a[i].length;j++){
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
}
public class JiuGongTu {
int count=1;//显示图像的个数
int position=0;//取出数字的位置
int [] result=new int[9];//存放取出数组
public static void main(String[] args) {
int[] number={1,2,3,4,5,6,7,8,9};
new JiuGongTu().recursion(number);
//new JiuGongTu().enumaretion();//启动枚举
}
/////////////////////////////////////////////// 判断的模块
public boolean isMap(int [][] number){
boolean flag=false;//判断最终符合要求的标志
int[] sum1=new int[3];//判断行之和
int[] sum2=new int[3];//判断列之和
int sum3=0;//判断对角线1之和
int sum4=0;//判断对角线2之和
for(int i=0;i<3;i++)
{
sum1[i]=0;//初始化
sum2[i]=0;//初始化
for(int j=0;j<3;j++){
sum1[i]+=number[i][j];//求行的和
sum2[i]+=number[j][i];//求列的和
if(i==j)
sum3+=number[i][j];//第一条对角线求和
}
}
for(int i=0,j=2;i<3&&j>=0;j--,i++){//第二条对角线求和
sum4+=number[i][j];
}
if(equaltionNumber(sum1,sum2,sum3,sum4))//调用判断所有的和是不是符合要求
{
flag=true;
}
return flag;
}
public boolean equaltionNumber(int []sum1,int[] sum2,int sum3,int sum4){//判断方法
if(sum3!=sum4||sum4!=15){//判断对角线相等
return false;
}
for(int i=0;i<3;i++){
//System.out.print(sum1[i]+" "+sum2[i]);
if(sum1[i]!=15||sum1[i]!=sum2[i])//判断行和列的和是否相等
{return false;}
}
return true;
}
public void enumerationArray(int [] startNumber){//给二维数组付值并显示
int [][] number=new int[3][3];
for(int i=0,k=0;i<3;i++){//给二维数组赋值
for(int j=0;j<3;k++,j++){
number[i][j]=startNumber[k];
}
}
if(isMap(number)){//调用判断符合就显示图象
System.out.println("!!!!!!!"+"九宫图第"+(count++)+"幅图:");
for(int i=0,k=0;i<3;i++){
for(int j=0;j<3;k++,j++){
System.out.print(number[i][j]+"\t");
}
System.out.println();
}
}
}
////////////////////////////////////////////////////枚举模块
/* public void enumaretion(){
for(long i=123456789;i<987654321;i++){
equalsAll(i);
}
}
public boolean equalsAll(long number){//截取没有重复数字的9位数排列
StringBuilder s=new StringBuilder(number+"");
boolean flag=false;
////////////////////截取出9个数字
char a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;
a=s.charAt(0);b=s.charAt(1);c=s.charAt(2);d=s.charAt(3);e=s.charAt(4);
f=s.charAt(5);g=s.charAt(6);h=s.charAt(7);i=s.charAt(8);
///////////////比较九个数字是否有重复的
if(a==48||b==48||c==48||d==48||e==48||f==48||g==48||h==48||i==48)
return flag;
if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i)
return flag;
if(b==c||b==d||b==e||b==f||b==g||b==h||b==i)
return flag;
if(c==d||c==e||c==f||c==g||c==h||c==i)
return flag;
if(d==e||d==f||d==g||d==h||d==i)
return flag;
if(e==f||e==g||e==h||e==i)
return flag;
if(f==g||f==h||f==i)
return flag;
if(g==h||g==i)
return flag;
if(h==i)
return flag;
//////////////////////////////////判断结束之后没有返回说明符合要求变换成int型数组
int [] num= new int[9];
num[0]=a-48;
num[1]=b-48;
num[2]=c-48;
num[3]=d-48;
num[4]=e-48;
num[5]=f-48;
num[6]=g-48;
num[7]=h-48;
num[8]=i-48;
enumerationArray(num);//付给二维数组
return flag=true;
}
*/
////////////////////////////////////////迭代的方法进行枚举
public void recursion(int [] number){//迭代出所有组合
if(number.length==1){//迭代出口
result[position]=number[0];
enumerationArray(result);
return;
}else {
for(int i=0;i<number.length;i++){
result[position]=number[i];
position++;
recursion(subArray(number,i));
position--;
}
}
}
public int[] subArray(int [] number,int X){//截取子字符串
int[] temp=new int[number.length-1];
for(int i=0,j=0;i<temp.length&&j<number.length;j++){
if(j!=X){
temp[i]=number[j];
i++;
}
}
return temp;
}
}
public class Nine15 {
public Nine15() {
}
public static void main(String[] args) {
Nine15 nine15 = new Nine15();
nine15.makeMatrix();
}
private boolean test(int[][] m) {
int sums[] = { 0, 0, 0 };
boolean finishes[] = { true, true, true };
for (int j = 0; j < 3; j++) {
int sum = 0;
boolean finished = true;
for (int i = 0; i < 3; i++) {
sum += m[j][i];
sums[i] += m[j][i];
if (m[j][i] == 0) {
finished = false;
finishes[i] = false;
}
}
if (sum > 15) {
return false;
}
if (finished && sum != 15) {
return false;
}
}
if (sums[0] > 15 || sums[1] > 15 || sums[2] > 15) {
return false;
}
if (finishes[0] && sums[0] < 15) {
return false;
}
if (finishes[1] && sums[1] < 15) {
return false;
}
if (finishes[2] && sums[2] < 15) {
return false;
}
int s1 = m[0][0] + m[1][1] + m[2][2];
if (s1 > 15) {
return false;
}
if (m[0][0] > 0 && m[1][1] > 0 && m[2][2] > 0 && s1 < 15) {
return false;
}
int s2 = m[0][2] + m[1][1] + m[2][0];
if (s2 > 15) {
return false;
}
if (m[0][2] > 0 && m[1][1] > 0 && m[2][0] > 0 && s2 < 15) {
return false;
}
return true;
}
private void print(int[][] m) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
System.out.print("\t" + m[j][i]);
}
System.out.println();
}
}
private void makeMatrix() {
int m[][] = new int[3][3];
int p = 0;
int v = 9;
int pv[] = new int[10];
while (v > 0) {
if (p == 9) {
++v;
if (v == 10) {
break;
}
p = pv[v];
int rr = p / 3;
int cc = p % 3;
m[rr][cc] = 0;
pv[v] = 0;
p++;
continue;
}
int r = p / 3;
int c = p % 3;
if (m[r][c] > 0) {
p++;
continue;
}
m[r][c] = v;
if (test(m)) {
if (v > 1) {
pv[v] = p;
v--;
p = 0;
} else {
System.out.println("=======");
print(m);
m[r][c] = 0;
p++;
}
} else {
m[r][c] = 0;
p++;
}
}
}
}