📄 九宫.cpp
字号:
///////////////////////////////////////
// 九宫图算法;
//////////////////////////////////////
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<conio.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 judge_x6(int [][3]);
void judge_x7(int [][3]);
void judge_x8(int [][3]);
void judge_x9(int [][3]);
void judge_x10(int [][3]);
void judge_x11(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]);
///////////////////////////////////////////////////////
///// shift from array[1][0] to array[2][2] ////
///////////////////////////////////////////////////////
void shift_low_six(int array[][3])
{
int temp;
temp=array[1][0];
array[1][0]=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]=temp;
}
////////////////////////////////////////////////////////
//// shift from array[0][0] to array[2][2] /////////
////////////////////////////////////////////////////////
void shift_all(int array[][3])
{
int temp;
temp=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[0][2];
array[0][2]=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;
}
//////////////////////////////////////////
/////// shift aiti-direction ///////
////////////////////////////////////////
void anti_shift_all(int array[][3])
{
int temp;
temp=array[1][0];
array[1][0]=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[0][2];
array[0][2]=array[1][2];
array[1][2]=array[2][2];
array[2][2]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=temp;
}
/////////////////////////////////////////
////// shift_low_four /////////////
/////////////////////////////////////////
void shift_low_four(int array[][3])
{
int temp;
temp=array[1][1];
array[1][1]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
///////////////////////////////////////
////// 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);
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;line<3;line++)
{
for(row=0;row<3;row++)
{
array[line][row]=10;
}
}
}
/////////////////////////////////////////
/// 显示数组状态 ////
////////////////////////////////////////
void show(int array[][3])
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%3d",array[i][j]);
}
printf("\n\n");
}
}
///////////////////////////////
/// 产生数组的初始状态 ///////
///////////////////////////////
void set_value(int array[][3])
{
int n;
int i=0;
int rand_num_line;
int rand_num_row;
printf(" \n\n请输入选择:1 随机输入 2 手动输入\n\n");
scanf("%d",&n);
if(n!=1||n!=2)
{
target(array);
}
printf("\n ***************** \n");
printf("\n 运 算 开 始 :\n");
if(n==1)
{
//随机选取九个数字
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;
}
}
}
else
{
printf("\n请从键盘输入九宫图(空格用0代替):\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&array[i][j]);
}
}
printf("\n九宫图的初始值为:\n");
}
show(array);
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;line<3;line++)
{
for(row=0;row<3;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])
{
int n;
printf(" \n输入有误,请重新输入:");
printf(" \n\n请输入选择:1 随机输入 2 手动输入\n\n");
scanf("%d",&n);
}
////////////////////////////////////
///judge the x1 is 1 or no! ///////
////////////////////////////////////
void judge_x1(int array[3][3])
{
if(array[0][0]==1)
{
judge_x3(array);
}
else
judge_x2(array);
}
//////////////////////////////////
/// judge the x2's position /////
//////////////////////////////////
void judge_x2(int array[3][3])
{
int temp;
if(array[0][2]==1 || array[0][2]==0)
{
if(array[0][1]!=1 && array[0][1]!=0)
{
temp=array[0][1];
array[0][1]=array[0][2];
array[0][2]=temp;
}
else
{
temp=array[1][2];
array[1][2]=array[0][2];
array[0][2]=temp;
}
}
while(array[0][0]!=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;
}
while(array[1][0]!=0)
{
temp=array[0][1];
array[0][1]=array[0][2];
array[0][2]=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]=array[1][1];
array[1][1]=temp;
}
printf(" 确定了数码1位置后,九宫图为:\n");
show(array);
judge_x3(array);
}
//////////////////////////////////////////
///// judge x3's position ///////
//////////////////////////////////////////
void judge_x3(int array[][3])
{
int temp;
while(array[0][1]!=2)
{
temp=array[0][1];
array[0][1]=array[0][2];
array[0][2]=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]=array[1][1];
array[1][1]=temp;
}
if(array[0][2]==0)
{
temp=array[0][2];
array[0][2]=array[1][2];
array[1][2]=temp;
}
while(array[1][1]!=0)
{
shift_low_six(array);
}
printf(" 确定了数码2位置后,九宫图为: \n");
show(array);
if(array[0][2]==3)
{
judge_x7(array);
}
else
{
judge_x4(array);
}
}
//////////////////////////////////////////
///// judge x4's position ///////
//////////////////////////////////////////
void judge_x4(int array[][3])
{
int temp;
if(array[0][2]!=3)
{
while(array[1][1]!=3)
{
shift_low_six(array);
}
if(array[2][0]==0)
{
temp=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
else if(array[2][1]==0)
{
temp=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
else if(array[2][2]==0)
{
temp=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[1][2]==0)
{
temp=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;
}
}
printf(" 确定了数码3位置后,九宫图为:\n");
show(array);
judge_x5(array);
}
//////////////////////////////////////////////
////// judge x5's position ///////////
/////////////////////////////////////////////
void judge_x5(int array[][3])
{
int temp;
while(array[1][1]!=0)
{
temp=array[0][0];
array[0][0]=array[1][0];
array[1][0]=array[1][1];
array[1][1]=array[0][1];
array[0][1]=temp;
}
printf(" 确定了数码0位置后,九宫图为:\n");
show(array);
judge_x6(array);
}
//////////////////////////////////////////////
////// judge x6's position ///////////
//////////////////////////////////////////////
void judge_x6(int array[][3])
{
int temp;
while(array[1][0]!=0)
{
temp=array[0][0];
array[0][0]=array[1][0];
array[1][0]=array[1][1];
array[1][1]=array[1][2];
array[1][2]=array[0][2];
array[0][2]=array[0][1];
array[0][1]=temp;
}
printf(" 重新确定了数码0位置后,九宫图为:\n");
show(array);
judge_x7(array);
}
//////////////////////////////////////////////
////// judge x7's position ///////////
//////////////////////////////////////////////
void judge_x7(int array[][3])
{
int temp;
while(array[1][2]!=4)
{
shift_low_six(array);
}
if(array[2][2]==0)
{
temp=array[2][2];
array[2][2]=array[2][1];
array[2][1]=temp;
}
while(array[1][1]==0)
{
shift_low_four(array);
}
printf(" 确定了数码4位置后,九宫图为:\n");
show(array);
if(array[2][2]==5)
{
judge_x11(array);
}
else
{
judge_x8(array);
}
}
//////////////////////////////////////////////
////// judge x8's position ///////////
//////////////////////////////////////////////
void judge_x8(int array[][3])
{
int temp;
while(array[1][1]!=5)
{
shift_low_four(array);
}
if(array[2][0]==0)
{
temp=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
else if(array[2][1]==0)
{
temp=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
printf(" 确定了数码5位置后,九宫图为:\n");
show(array);
judge_x9(array);
}
//////////////////////////////////////////////
////// judge x9's position ///////////
//////////////////////////////////////////////
void judge_x9(int array[][3])
{
int temp;
temp=array[1][0];
array[1][0]=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[0][2];
array[0][2]=array[1][2];
array[1][2]=temp;
temp=array[1][2];
array[1][2]=array[1][1];
array[1][1]=array[2][1];
array[2][1]=temp;
printf(" 确定了数码0位置后,九宫图为:\n");
show(array);
judge_x10(array);
}
//////////////////////////////////////////////
////// judge x10's position ///////////
//////////////////////////////////////////////
void judge_x10(int array[][3])
{
while(array[2][0]!=0)
{
anti_shift_all(array);
}
printf(" 最后确定数码5位置后,九宫图为:\n");
show(array);
judge_x11(array);
}
//////////////////////////////////////////////
////// judge x11's position ///////////
//////////////////////////////////////////////
void judge_x11(int array[][3])
{
while(array[2][1]!=6)
{
shift_low_four(array);
}
e: if(array[2][0]==7)
{
array[1][1]=0;
array[1][0]=8;
}
if(array[2][0]==0)
{
array[2][0]=array[1][0];
array[1][0]=0;
goto e;
}
printf("***********************************\n");
printf("***********************************\n\n");
printf(" 经过计算,最终的九宫图为: \n");
show(array);
if(array[2][0]==7)
{
printf("****************************\n");
printf("** 此为九宫图的最终解! **\n");
printf("****************************\n");
}
else
{
printf("****************************\n");
printf("** 对不起,此无解九宫图!**\n");
printf("****************************\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -