本文共 4271 字,大约阅读时间需要 14 分钟。
闲来无聊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>幻方大全>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1、奇幻方 N=2*M+1(M=1,2,3,……)的布阵规律
a、把1放在N*N方阵中的第一行中间一列,即放在位置为(1,(N+1)/2); b、后一个数存放的行数比前一个数存放的行数减1,若这个行数为0,则取行数为N; c、后一个数存放的列数比前一个数存放的列数加1,若这个列数为N+1,则取列数为1;
d、如果前一个数是N的倍数,则后一个数存放的列数不变,而行数加1。
#include<stdio.h> #include<stdlib.h>
int main() { int M, N, i, j; printf("Please input M = "); scanf( "%d", &M ); N = M * 2 - 1; if ( N % 2 == 0 ) { N++; //!> 保证是奇数 }
int ** numArray= ( int ** )malloc( N * sizeof( int * )); //!> 注意malloc是默认是void*返回值,所以一般需要强转 for ( i = 0; i < N; i ++ ) { numArray[i] = ( int * )malloc(N * sizeof( int )); //!> 大小有用户输入 }
for ( i = 0; i< N; i++ ) { for ( j = 0; j <N; j++ ) { numArray[i][j]= 0; } } //>>>>>>>>>>>>>>>> numArray[0][N/2] =1; //!> a
int nextNum =2; int numHaveLeft = N * N -1; int hang = 0; int lie = N /2;
while(numHaveLeft ) {
if ( ( nextNum - 1 )% N == 0 ) { hang++; } else { hang--; if ( hang ==-1 ) { hang= N - 1; } lie++; if ( lie == N) { lie= 0; } }
numArray[hang][lie] =nextNum++; numHaveLeft--; } for ( i = 0; i < N; i++ ) { for ( j = 0; j <N; j++ ) { printf("%-3d ", numArray[i][j]); } printf("\n"); }
return 0; }
2、偶幻方N=4*(M=1,2,3,……)的布阵规律先将1至N*N由小到大的顺序,从第一行开是依序填入N*N的方阵中,然后将N*N的方阵以4行4列划分为若干个4*4的小方阵,再将所有4*4小方阵的两个对角线上的数字划掉,之后将所有被划掉的数字重新由大到小的进行排列,然后再将这些数字按排列顺序由N*N方阵的第一行开始,放入被划掉的格子中去。则此时的偶幻方也就布好阵了
#include<stdio.h> #include<stdlib.h> #define N 4 //!> 注意N必是4的倍数
void sort( int arr[], int count) { int i, j, temp; for ( i = 1; i < count; i++) { for ( j = 0; j <count - i; j++ ) { if ( arr[j]< arr[j+1] ) { temp= arr[j]; arr[j]= arr[j+1]; arr[j+1]= temp; } } } }
int main() { int numArray[N][N]; int t, i, j,x, y; int numInto= 0; inttempArray[10]; for ( i = 0; i < N; i++ ) { for ( j = 0; j <N; j++ ) { numArray[i][j]= ++numInto; } } int startHang =0; //!> 其实只要知道其实的航和列就可以了,因为4是固定不改变的! int startLie = 0; for ( ; startHang < N; startHang+= 4 ) //!>注意怎么分成小块的,其实也就是整体上的for。。。 { t = 0; for ( ; startLie< N; startLie += 4 ) { t = 0; for ( x = 0,y = 0; x < 4 && y< 4; x++, y++) //!> 将做对角线放进temp数组 { //!> 为了方便计算,置0 tempArray[t++]= numArray[startHang+x][startLie+y]; numArray[startHang+x][startLie+y]= 0; } for ( x = 0,y = 3; x < 4 && y>= 0; x++, y--) //!> 将有对角线放进temp数组 { tempArray[t++] = numArray[startHang+x][startLie+y]; numArray[startHang+x][startLie+y] = 0; } sort(tempArray, t); //!> 排序 t = 0; for ( x = 0;x < 4; x++) //!> 写回 { for( y = 0; y < 4; y++ ) { if( numArray[startHang+x][startLie+y] == 0 ) { numArray[startHang+x][startLie+y]= tempArray[t++]; } } }
} }
for ( i = 0; i< N; i++ ) { for ( j = 0; j <N; j++ ) { printf("%-3d ", numArray[i][j] ); } printf("\n"); }
return 0; }
3、偶幻方N=2*(2*M+1)(M=1,2,3,……)的布阵规律先将N*N的方阵划分为2*2的四个小方阵,设为A,B,C,D,则这四部分都正好是奇行奇列的方阵,设每个小方阵为U*U,其中U=N/2。然后将1至U*U按奇幻方的的方式填入小方 阵A中,同理填入U*U+1至U*U*2到B中,填入U*U*2+1至U*U*3到C中,填入U*U*3+1至U*U*4到D中。然后按下列方法交换: a、将A和D的第一列对应位置的元素(出各自的中间一行外)进行交换;
b、将A和D的中间一列的中间一行的元素进行交换; c、如果(U+1)/2>2,则将A和D中左边的第二列开始到第(U-1)/2列为止,对应行的数字全部进行交换,同时将B 和C右边第一列起连续(U-1)/2-1列对英航的数字也全部进行交换。
#include<stdio.h> #include<stdlib.h> #define M 1 #define N 2 * ( 2 * M + 1 )
int main() { int numArray[N][N]; int startHang = 0; int startLie = 0; int numStart = 1; int i, j, x, y, temp;
for ( x = 0; x< 2; x++ ) { for ( y = 0; y <2; y++ ) { for ( i =startHang; i < startHang + N / 2; i++ ) { for( j = startLie; j < startLie + N / 2; j++ ) { numArray[i][j]= numStart++; } } startLie += N/ 2; } startLie = 0; startHang += N / 2; } for ( i = 0; i < N / 2; i++) //!> a { if ( i != N / 4 ) { temp =numArray[i][0]; numArray[i][0]= numArray[N/2+i][N/2]; numArray[N/2+i][N/2]= temp; } } temp =numArray[N/4][N/4]; //!> b numArray[N/4][N/4] =numArray[N/2+N/4][N/4+N/2]; numArray[N/2+N/4][N/2+N/4] =temp;
for ( i = 0; i< N; i++ ) { for( j = 0; j <N; j++ ) { printf("%d ", numArray[i][j]); } printf("\n"); } printf("\n\n"); if ( ( N / 2 + 1) / 2 > 2 ) { for ( j = 1; j<= ( N / 2 - 1 ) / 2; j++ ) { for ( i = 0;i < N / 2; i++ ) { temp= numArray[i][j]; numArray[i][j]= numArray[N/2+i][N/2+j]; } }
for ( i = 0, x = N /2; i < N / 2 && x< N; i++, x++ ) { for ( j = N /2, y = 0 ; j < N &&y < N / 2; y++, j++ ) { temp= numArray[i][j]; numArray[i][j]= numArray[x][y]; numArray[x][y]= temp; } } }
for ( i = 0; i < N; i++ ) { for( j = 0; j <N; j++ ) { printf("%d ", numArray[i][j]); } printf("\n"); }
return 0; }
转载地址:http://eoaci.baihongyu.com/