當前位置:首頁 » 編程語言 » 三階幻方c語言演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

三階幻方c語言演算法

發布時間: 2022-12-07 21:02:53

⑴ 求九宮問題程序(C語言實現)

【轉】
/*九宮圖演算法說明:根據分析,九宮圖中間一位一定是5,另外關於中間位置
對稱的每兩個數字相加等於10,所以對於一個九宮圖只通過其相鄰位置的數
字就能計算出其他所有位置的數字,而且相鄰位置的數字必然一個比5大,一
個比5小
演算法設計思想:先根據選取規則,從剩下八個數裡面選一大一小,再使用目
標函數檢測選取是否正確,如果正確則列印出,否則重新選取,選數的過程
使用回溯法*/

#include<stdio.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);

}

}

【轉】
///////////////////////////////////////
// 九宮圖演算法;
//////////////////////////////////////

#include<sio.h>
#include<time.h>
#include<slib.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;line<3;line )
{
for(row=0;row<3;row )
{
array[line][row]=10;
}
}
// set_value(array);
//show(array);
}

/////////////////////////////////////////
/// 顯示數組狀態 ////
////////////////////////////////////////

void show(int array[][3])
{
for(int i=0;i<3;i )
{
for(int j=0;j<3;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;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])
{
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");

⑵ C或C++編寫三階幻方

它分奇偶數的。
奇數的規律比較明確,偶數也有規律。
三階
8 1 6
3 5 7
4 9 2
五階
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
對於三階
數1都在第一行的正中央(1行2列),然後你往它的上一行,下一列(0行3列,由於沒有0行,就往最底下去。變成3行3列),接著就是2行1列
然後再1行2列,由於已經被1給佔了,那麼第4個數就放在1的正下方,反復如此就可以得到奇數階的幻方數。

4階
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

6階
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11

8階
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1
偶數價我給忘了。但是我記得好像是4的倍數跟不是4的倍數,演算法還不一樣。