一个古老的游戏

蓝爻妖 2012-02-01 04:33:43
我在编写九宫图,这个是很古老的游戏,大家都知道,规矩就是,在9*9的方矩里,横的,竖的,还有九个,小的3*3的方矩里,每个数字都不一样,我就解释这么多,因为很多人都知道这个
我刚开始学C语言,用C语言成功的编写了,但是把里面的数字规定死了,怎么样都只能出现一个排版好的九宫格,后来我用随机数来写,发现,循环了好久都没输出

慢慢的我接触了JAVA,并且成功用JAVA改写了,当时用C语言写的九宫格,可是用随机数字来制造出每次刷出新的九宫格都不一样的想法还是破灭了,因为这个九宫格本身就是大量FOR与IF组成的,导致使用随机方法让这个循环无限倍的扩大,我写出来了,运行了好久都没做好,想请教高手,如何提高效率,减少多余的循环,来编写这个随机的九宫格,谢谢了,如果需要我的代码的,可以跟我说,我发上来
...全文
166 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝爻妖 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yaoweijq 的回复:]
奇数阶幻方有固定的填法,按那个来填就行了
穷举法对这些小的可以用
大的就不行了
深度优先+剪枝可以考虑初步优化下
[/Quote]

求解~~~~~如何深度优先+剪枝
蓝爻妖 2012-02-01
  • 打赏
  • 举报
回复
/*
*这是测试代码,直接创建,jiugong对象,并且调用方法,然后施行输出
*/
public class kaishi {

public static void main(String[] haker)
{
jiugong jiu = new jiugong();
jiu.jiuGong();
for(int i = 0;i < 9;i++)
{
for(int f = 0;f < 9;f++)
{
System.out.printf("%d",jiu.tu[i][f]);
}
System.out.println();
}
}
}
蓝爻妖 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 podongxi777442156445 的回复:]
Java的就发上来吧·虽然不怎么会,但是看看,给点意见
[/Quote]

import java.util.Random;
/*
* 九宫图的核心调用,初始其他类的对象,并且创建
* 因为我都是放在同一个包下得不同文件
*/
public class jiugong {
public static int[][] tu = new int[9][9];
Random suijishu = new Random();
Hengceshi hangceshi = new Hengceshi();
Lieceshi lieceshi = new Lieceshi();
Xiaojiugong xiaojiugong = new Xiaojiugong();
int sui;
int hang,lie;
public void jiuGong()
{
/*
* 这是每行的循环
*/
for(hang = 0; hang < 9; hang++)
{
/*
* 这是每列的循环
*/
for(lie = 0; lie < 9;)
{
/*
* 这是随机产生的1-9的数字
*/
sui = (int)(suijishu.nextDouble()* 9);
/*
* 调用横向测试,测试当前行上是否有重复的数字
*/
int i = hangceshi.hangceshi(tu, hang, lie, sui);
if(i == 1)
{
/*
* 当通过横向测试,进入竖向测试,测试当前列是否有重复数字
*/
i = lieceshi.leiceshi(tu, hang, lie, sui);
if(i == 1)
{
/*
* 当横竖测试都通过时,进入小九宫体进入测试,整条程序,这个测试最为繁重,并且,容易重复
* 这个测试类是主要让整个程序循环测试最多的重点
*/
i = xiaojiugong.xiaojiugongCS(tu, hang, lie, sui);
if(i == 0)
{
continue;
/*
* 如果测试有重复,则放弃当前循环,重新生成随机数字
*/
}
}else
{
continue;
/*
* 如果测试有重复,则放弃当前循环,重新生成随机数字
*/
}
}else
{
continue;
/*
* 如果测试有重复,则放弃当前循环,重新生成随机数字
*/
}
/*
* 当所有测试通过,进入下一个格子位置的数字生成
*/
lie++;
}
}
}
}





public class Hengceshi {
/*
* 简单的横向,行测试
*/
public Hengceshi(int tu[][],int hang,int lie , int suijishu)
{
hangceshi(tu,hang,lie,suijishu);
}
public Hengceshi(){};
int hangceshi(int tu[][],int hang,int lie , int suijishu)
{
int i;
for(i = 0; i < 9 ; i++)
{
if(tu[hang][i] == suijishu)
{
break;
}
}
if(i == 9)
{
return 1;
}else
{
return 0;
}
}
}




public class Lieceshi {
/*
* 简单的竖向,列测试
*/
public Lieceshi(int tu[][],int hang,int lie ,int suijishu)
{
leiceshi(tu,hang,lie,suijishu);
}
public Lieceshi(){};
int leiceshi(int tu[][],int hang,int lie ,int suijishu)
{
int i;
for(i = 0; i < 9 ; i++)
{
if(tu[i][lie] == suijishu)
{
break;
}
}
if(i == 9)
{
return 1;
}else
{
return 0;
}
}

}





public class Xiaojiugong {
public Xiaojiugong(){};
int i;
public Xiaojiugong(int tu[][],int hang ,int lie ,int suijishu){
xiaojiugongCS(tu,hang,lie,suijishu);
}
/*
* 最为繁重的小九宫测试,每一次测试至少要循环81次!
*/
int xiaojiugongCS(int tu[][],int hang,int lie,int suijishu)
{
if(hang < 3)
{
if(lie < 3)
{
for(i = 0;i < 3;i++ )
{
for(int j = 0;j < 3; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 3)
{
tu[hang][lie] = suijishu;
}
}else if(lie < 6)
{
for(i = 0;i < 3;i++ )
{
for(int j = 3;j < 6; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 3)
{
tu[hang][lie] = suijishu;
}
}else
{
for(i = 0;i < 3;i++ )
{
for(int j = 6;j < 9; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 3)
{
tu[hang][lie] = suijishu;
}
}
}else if(hang < 6)
{
if(lie < 3)
{
for(i = 3;i < 6;i++ )
{
for(int j = 0;j < 3; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 6)
{
tu[hang][lie] = suijishu;
}
}else if(lie < 6)
{
for(i = 3;i < 6;i++ )
{
for(int j = 3;j < 6; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 6)
{
tu[hang][lie] = suijishu;
}
}else
{
for(i = 3;i < 6;i++ )
{
for(int j = 6;j < 9; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 6)
{
tu[hang][lie] = suijishu;
}
}
}else
{
if(lie < 3)
{
for(i = 6;i < 9;i++ )
{
for(int j = 0;j < 3; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 9)
{
tu[hang][lie] = suijishu;
}
}else if(lie < 6)
{
for(i = 6;i < 9;i++ )
{
for(int j = 3;j < 6; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 9)
{
tu[hang][lie] = suijishu;
}
}else
{
for(i = 6;i < 9;i++ )
{
for(int j = 6;j < 9; j++)
{
if(tu[i][j] == suijishu)
{
return 0 ;
}
}
}
if(i == 9)
{
tu[hang][lie] = suijishu;
}
}
}
return 1;
}

}
yaoweijq 2012-02-01
  • 打赏
  • 举报
回复
奇数阶幻方有固定的填法,按那个来填就行了
穷举法对这些小的可以用
大的就不行了
深度优先+剪枝可以考虑初步优化下
beowulf2005 2012-02-01
  • 打赏
  • 举报
回复
没学过数论,就不要玩幻方了。
盲目搜索的搜索空间太大,这个复杂度不是现阶段计算机能承受的。
暖暖猫 2012-02-01
  • 打赏
  • 举报
回复
Java的就发上来吧·虽然不怎么会,但是看看,给点意见

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧