java编程题,在九宫格内填入1—9九个数字,使得横竖排的数字相加之和都相等/*直接复制运行就可以java九宫格棋代码,每一行java九宫格棋代码的九个数字代表一个九宫格的9个数字java九宫格棋代码,从左到右,从上到下*/
import java.util.ArrayList;
import java.util.Arrays;
public class Test1 {
private static ArrayListString arrangeList = new ArrayListString();
public static void main(String[] args) {
String str = "123456789";//java九宫格棋代码你要排列组合的字符串
char list[] = str.toCharArray();//将字符串转换为字符数组
genernateData(list, 0, list.length - 1);//参数为字符数组和0和字符数组最大下标
int arr[]=new int[9];
for(String str1 : arrangeList){
for(int k=0;k9;k++){
arr[k]=Integer.parseInt(str1.substring(k,k+1));
}
if(arr[0]+arr[1]+arr[2]==15arr[3]+arr[4]+arr[5]==15arr[6]+arr[7]+arr[8]==15arr[0]+arr[3]+arr[6]==15arr[1]+arr[4]+arr[7]==15arr[2]+arr[5]+arr[8]==15arr[0]+arr[4]+arr[8]==15arr[2]+arr[4]+arr[6]==15){
System.out.println(Arrays.toString(arr));
}
}
}
public static void genernateData(char list[], int k, int m) {
if (km) {
StringBuffer sb = new StringBuffer();//创建一个StringBuffer对象sb
for (int i = 0; i = m; i++) {
sb.append(list[i]);//循环将字符数组值追加到StringBuffer中
}
arrangeList.add(sb.toString());
} else {
for (int i = k; i = m; i++) {
swapData(list, k, i);//将下表为k和i的值调换位置
genernateData(list, k + 1, m);
swapData(list, k, i);
}
}
}
private static void swapData(char list[], int k, int i) {
char temp = list[k];
list[k] = list[i];
list[i] = temp;
}
}
九宫格拼图·求此问题解法~~思路~代码都可~~就是关于其还原算法的·急~在线等~多谢哈在一个3×3的九宫中有1-8这8个数及一个空格随机的摆放在其中的格子里,如图1-1所示 。现在要求实现这个问题:将其调整为如图1-1右图所示的形式 。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中 。试编程实现这一问题的求解 。
(图1-1)
二、题目分析:
这是人工智能中的经典难题之一 , 问题是在3×3方格棋盘中,放8格数 , 剩下的没有放到的为空 , 每次移动只能是和相邻的空格交换数 。程序自动产生问题的初始状态,通过一系列交换动作将其转换成目标排列(如下图1-2到图1-3的转换) 。
(图1-2)(图1-3)
该问题中,程序产生的随机排列转换成目标共有两种可能,而且这两种不可能同时成立,也就是奇数排列和偶数排列 。可以把一个随机排列的数组从左到右从上到下用一个一维数组表示,如上图1-2我们就可以表示成{8,7,1,5,2,6,3,4,0}其中0代表空格 。
在这个数组中我们首先计算它能够重排列出来的结果 , 公式就是:
∑(F(X))=Y,其中F(X)
是一个数前面比这个数小的数的个数,Y为奇数和偶数时各有一种解法 。(八数码问题是否有解的判定 )
上面的数组可以解出它的结果 。
F(8)=0;
F(7)=0;
F(1)=0;
F(5)=1;
F(2)=1;
F(6)=3;
F(3)=2;
F(4)=3;
Y=0+0+0+1+1+3+2+3=10
Y=10是偶数,所以其重排列就是如图1-3的结果,如果加起来的结果是奇数重排的结果就是如图1-1最右边的排法 。
三、算法分析
求解方法就是交换空格(0)位置,直至到达目标位置为止 。图形表示就是:
(图3-1)
要想得到最优的就需要使用广度优先搜索,九宫的所以排列有9!种,也就是362880种排法,数据量是非常大的,使用广度搜索,需要记住每一个结点的排列形式 , 要是用数组记录的话会占用很多的内存,可以把数据进行适当的压缩 。使用DWORD形式保存,压缩形式是每个数字用3位表示,这样就是3×9=27个字节 , 由于8的二进制表示形式1000,不能用3位表示,使用了一个小技巧就是将8表示为000,然后用多出来的5个字表示8所在的位置,就可以用DWORD表示了 。用移位和或操作将数据逐个移入 , 比乘法速度要快点 。定义了几个结果来存储遍历到了结果和搜索完成后保存最优路径 。
推荐阅读
- 专升本直播英语技巧视频,专升本英语上课视频
- sapvl09冲销的简单介绍
- 技巧分享学习直播,学直播的技巧
- java退出代码怎么打开 java退出按钮
- 硬盘转接口怎么连接,硬盘转接线怎么接
- 软件工程毕业设计动画制作,有创意的软件工程毕业设计
- 直播带货收益如何计算的,直播带货盈利
- go语言切片的比较 golang 切片长度和容量
- 包含thinkphp3.2.3like的词条