重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
九宫图
创新互联致力于做网站、成都网站设计,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联,就选择了安全、稳定、美观的网站建设服务!
#includestdio.h
#includetime.h
#includestdlib.h
the function defination
void create(int [][3]);
void show(int [][3]);
void set_value(int [][3]);
void aim_get(int [][3]);
void target(int [][3]);
void judge_x1(int [][3]);
void judge_x2(int [][3]);
void judge_x3(int [][3]);
void judge_x4(int [][3]);
void judge_x5(int [][3]);
void shift_all(int [][3]);
void shift_low_six(int [][3]);
void anti_shift_all(int [][3]);
void shift_low_four(int [][3]);
void last_shift(int [][3]);
void set_x5(int [][3]);
the main function body main()
srand(time(NULL));
int cDiagram[3][3];
create(cDiagram); creat the new array ,set the value are 10;
set_value(cDiagram);
//last_shift(cDiagram);
return 0;
}
建立一个3*3数组,初值都设为10
void create(int array[][3])
{
printf("\n\n**\n\n");
printf("九宫图算法实现过程\n\n");
printf("**\n\n");
int line;
int row;
for(line=0;line3;line++)
{
for(row=0;row3;row++)
{
array[line][row]=10;
}
}
// set_value(array);
//show(array);
}
显示数组状态
void show(int array[][3])
{
for(int i=0;i3;i++)
{
for(int j=0;j3;j++)
{
printf("%3d",array[i][j]);
}
printf("\n\n");
}
}
产生数组的初始状态 void set_value(int array[][3])
{
int i=0;
int rand_num_line;
int rand_num_row;
printf(" \n\n九宫图的初始值为:\n\n");
while(i=8)
{
rand_num_line=rand()%3;
rand_num_row=rand()%3;
if(array[rand_num_line][rand_num_row]!=i array[rand_num_line][rand_num_row]==10)
{
array[rand_num_line][rand_num_row]=i;
++i;
}
}
show(array);
//printf(" let's begin!!\n");
aim_get(array);
}
judge the initial array get the target or no !
void aim_get(int array[][3])
{
int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
int line;
int row;
int judge=0;
for(line=0;line3;line++)
{
for(row=0;row3;row++)
{
if(array[line][row]!=aim[line][row])
{
judge=1;
}
}
}
if(judge==1)
{
judge_x1(array);
}
else
{
target(array);
}
}
the target diagram
void target(int array[][3])
{
printf("\n\n the last diagram is :\n");
show(array);
}
/judge the x1 is 1 or no!
void judge_x1(int array[3][3])
{
//int x1=1;
int temp;
//printf(" \n\n\n the array[0][2]=%d\n\n",array[0][2]);
if(array[0][2]!=1 array[0][2]!=0) // x3!=1 || x3!=0;
{
while(array[0][0]!=1)
{
//printf("i am here!!1");
temp=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[1][1];
array[1][1]=array[1][2];
array[1][2]=array[2][2];
array[2][2]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
}
else
{
if(array[0][2]==0) // x3==0;
{
// printf("\n\n array[0][2]=0\n\n");
temp=array[0][2];
array[0][1]=array[0][2];
array[0][2]=temp;
judge_x1(array);
goto tt;
}
我都看不懂……
/*直接复制运行就可以,每一行的九个数字代表一个九宫格的9个数字,从左到右,从上到下*/
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";//你要排列组合的字符串
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 (k m) {
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;
}
}
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
Scanner input = new Scanner(System.in);
System.out.println("输入数字:");
int k = input.nextInt();
for(int i=0;i3;i++){
for(int j=0;j3;j++){
if(arr[i][j]==k){
for(int m=i-1;m=i+1;m++){
for(int n=j-1;n=j+1;n++){
if(m=0m=2n=0n=2){
if(m!=i||n!=j)
System.out.print(arr[m][n]);
}
}
}
}
}
}
#include iostream
#include "grid9.h"
using namespace std;
struct notes
{
int n[40];
int top;
}route; // 用于记录路径
Grid9 grid; // 九宫格
int minDepth=40; // 记录最少步骤的步数
void inputG9();
void findG9(int depth);
int existing(int feature);
void main()
{
route.top=0; // 清空记录
inputG9(); // 输入原始数据
coutendl"开始计算步骤:"endl;
findG9(0); // 调用搜索程序
cout"最少需要"minDepth"步"endl; // 输出最小步骤数
system("pause");
}
void inputG9()
{
int in[9];
cout"请输入原始九宫数据:"endl;
cout"第一行:";
cinin[0]in[1]in[2];
cout"第二行:";
cinin[3]in[4]in[5];
cout"第三行:";
cinin[6]in[7]in[8];
for (int i=0;i9;i++)
grid.setGrid(i,in[i]);
}
void findG9(int depth)
{
int gd=grid.difference();
route.n[route.top++]=gd;
if (gd==0) // 得到一个解
{
minDepth=depth;
route.top--;
return;
}
if (depth==minDepth) // 已经到了最大深度,回溯
{
route.top--;
return;
}
for (int i=0;i12;i++)
{
grid.swap(i); // 交换i位置数据
gd=grid.difference();
if (!existing(gd))
findG9(depth+1); // 递归查找
grid.swap(i); // 恢复i位置数据
}
route.top--;
}
int existing(int feature)
{
for (int i=route.top-1;i=0;i--)
if (feature==route.n[i])
return 1;
return 0;
}
------解决方案--------------------------------------------------------
Grid9类的代码:
grid9.h
C/C++ codeclass Grid9
{
private:
int grid[9]; // 存储着九宫状态
public:
int readGrid(int x, int y); // 读出九宫中数值
int feature(); // 返回当前九宫状态的特征值
void setGrid(int feature); // 按特征值设置九宫
void setGrid(int index, int v); // 按索引设置九宫
int difference(); // 返回当前九宫状态距离完美九宫的差距,差距为0则意味着已经是完美九宫。
void swap(int position); // 交换指定位置上的数。
};
------解决方案--------------------------------------------------------
为了避免用户误以为死机,加一个进程显示在里面......有点破坏完美的感觉
C/C++ codevoid findG9(int depth)
{
route.n[route.top++]=grid.feature();
if (grid.difference()==0) // 得到一个解
{
if (depthminDepth)
cout"最短步骤已经下降到"depthendl;
minDepth=depth;
route.top--;
return;
}
if (depth==minDepth) // 已经到了最大深度,回溯
{
route.top--;
return;
}
for (int i=0;i12;i++)
{
grid.swap(i); // 交换i位置数据
if (!existing(grid.feature()))
findG9(depth+1); // 递归查找
grid.swap(i); // 恢复i位置数据
}
route.top--;
}
【转】
/*九宫图算法说明:根据分析,九宫图中间一位一定是5,另外关于中间位置
对称的每两个数字相加等于10,所以对于一个九宫图只通过其相邻位置的数
字就能计算出其他所有位置的数字,而且相邻位置的数字必然一个比5大,一
个比5小
算法设计思想:先根据选取规则,从剩下八个数里面选一大一小,再使用目
标函数检测选取是否正确,如果正确则打印出,否则重新选取,选数的过程
使用回溯法*/
#includestdio.h
int place(int*);
void main(void){/*九宫图算法*/
int a[9]={1,2,3,4,5,6,7,8,9};
int b[9]={0};/*表示数字的位置状态*/
int j,k,i;
for(k=0;k=3;k++){/*对于所有比5小的数*/
b[1]=a[k];/*选一比5小的数放到第一行第二列*/
for(j=8;j=5;j--){/*对于所有比5大的数*/
if(k!=(8-j)){/*不选择前面已选小数所对应的大数*/
b[0]=a[j];/*选一比5大的数放到第一行第一列*/
if(place(b)){/*若得到一解,则打印出*/
printf("\n 九宫图\n\n");
for(i=0;i=8;i++){
printf(" %d ",b[i]);
if((i+1)%3==0){
printf("\n\n\n");
}
}
getch();
exit(0);
}
} /* 回溯到上一级*/
} /*回溯到根一级 */
}
}
int place(int*p){ /*计算出其他位置的数字并检测是否为所求的解*/
p[2]=15-p[0]-p[1];
p[4]=5;
p[6]=10-p[2];
p[3]=15-p[0]-p[6];
p[5]=10-p[3];
p[7]=10-p[1];
p[8]=10-p[0];
if(p[2]+p[5]+p[8]==p[6]+p[7]+p[8]){/*其他行和列已通过计算检测了,只有第三行,第三列未检测*/
return(1);
}
else{
return(0);
}
}
【转】
///////////////////////////////////////
// 九宫图算法;
//////////////////////////////////////
#includesio.h
#includetime.h
#includeslib.h
//////////////////////////////////
//// the function defination
//////////////////////////////////
void create(int [][3]);
void show(int [][3]);
void set_value(int [][3]);
void aim_get(int [][3]);
void target(int [][3]);
void judge_x1(int [][3]);
void judge_x2(int [][3]);
void judge_x3(int [][3]);
void judge_x4(int [][3]);
void judge_x5(int [][3]);
void shift_all(int [][3]);
void shift_low_six(int [][3]);
void anti_shift_all(int [][3]);
void shift_low_four(int [][3]);
void last_shift(int [][3]);
void set_x5(int [][3]);
///////////////////////////////////////
////// the main function body ////
////////////////////////////////////////
main()
{
srand(time(NULL));
int cDiagram[3][3];
create(cDiagram); /////// creat the new array ,set the value are 10;
set_value(cDiagram);
//last_shift(cDiagram);
return 0;
}
///////////////////////////////////////
/// 建立一个3*3数组,初值都设为10;//
//////////////////////////////////////
void create(int array[][3])
{
printf("\n\n***********************************\n\n");
printf("九宫图算法实现过程\n\n");
printf("***********************************\n\n");
int line;
int row;
for(line=0;line3;line )
{
for(row=0;row3;row )
{
array[line][row]=10;
}
}
// set_value(array);
//show(array);
}
/////////////////////////////////////////
/// 显示数组状态 ////
////////////////////////////////////////
void show(int array[][3])
{
for(int i=0;i3;i )
{
for(int j=0;j3;j )
{
printf("=",array[i][j]);
}
printf("\n\n");
}
}
///////////////////////////////
/// 产生数组的初始状态 ///////
///////////////////////////////
void set_value(int array[][3])
{
int i=0;
int rand_num_line;
int rand_num_row;
printf(" \n\n九宫图的初始值为:\n\n");
while(i=8)
{
rand_num_line=rand()%3;
rand_num_row=rand()%3;
if(array[rand_num_line][rand_num_row]!=i array[rand_num_line][rand_num_row]==10)
{
array[rand_num_line][rand_num_row]=i;
i;
}
}
show(array);
//printf(" let's begin!!\n");
aim_get(array);
}
////////////////////////////////////////////////////////
//// judge the initial array get the target or no ! ///
//////////////////////////////////////////////////////////
void aim_get(int array[][3])
{
int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
int line;
int row;
int judge=0;
for(line=0;line3;line )
{
for(row=0;row3;row )
{
if(array[line][row]!=aim[line][row])
{
judge=1;
}
}
}
if(judge==1)
{
judge_x1(array);
}
else
{
target(array);
}
}
/////////////////////////////////////
/////// the target diagram //////////
/////////////////////////////////////
void target(int array[][3])
{
printf("\n\n the last diagram is :\n");
show(array);
}
////////////////////////////////////
///judge the x1 is 1 or no! ///////
////////////////////////////////////
void judge_x1(int array[3][3])
{
//int x1=1;
int temp;
//printf(" \n\n\n the array[0][2]=%d\n\n",array[0][2]);
if(array[0][2]!=1 array[0][2]!=0) // x3!=1 || x3!=0;
{
while(array[0][0]!=1)
{
//printf("i am here!!1");
temp=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[1][1];
array[1][1]=array[1][2];
array[1][2]=array[2][2];
array[2][2]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
}
else
{
if(array[0][2]==0) // x3==0;
{
// printf("\n\n array[0][2]=0\n\n");
temp=array[0][2];
array[0][1]=array[0][2];
array[0][2]=temp;
judge_x1(array);
goto tt;
}
else /// x3==1;
{ //printf("\n\narray[0][2] should is 1, %d",array[0][2]);
if(array[1][1]==0) //// x0==0;
{
temp=array[0][1];
array[0][1]=array[1][1];
array[1][1]=temp;
judge_x1(array);
}
else //// x3==1 x0!=0;
{
shift_all(array);
judge_x1(array);
}
}
}
printf(" 确定了X1位置后,九宫图为:\n");