当前位置: 技术问答>linux和unix
两道关于C语言的编程问题,自己有点思路,但是不知何处下手编写代码,请高手帮忙~
来源: 互联网 发布时间:2016-03-08
本文导语: 1 填魔方矩阵,矩阵如图所示 若n=5,则矩阵如下: 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 规则如下:n只能为奇数,则1的位置位于第一行中间,下一个数位于...
1 填魔方矩阵,矩阵如图所示
若n=5,则矩阵如下:
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
规则如下:n只能为奇数,则1的位置位于第一行中间,下一个数位于当前数的右上角,若超出行列范围,则循环进入下一行、列,当计数达到n的倍数时,下一个数位于当前数的正下方。
2 有0-9十个山洞,一只狼从第0个山洞开始寻找兔子。第一次隔一个山洞,第二次隔两个,第三次隔三个,第n次隔n个山洞,问最后有哪几个山洞没被狼找过?
下面这个只能是说是我想的第一题的算法,具体实现偶的基础实在是不好,找书也没有找到,拜托高手了
#include
main()
{
int i,k,l,n;
int u[k][l];
printf("输入一个正整数");
scanf("%d",&n);
for(i=1;i2,n阶幻方都存在。
目前填写幻方的方法,是把幻方分成了三类,每类又有各种各样的填写方法
本算法来自:http://blog.csdn.net/northwolves/archive/2007/09/23/1796696.aspx
---------------------------------------------------------------------*/
#include "stdafx.h"
#include
int get_n(); //读入阶数
int Odd_Construct(int,int*,int =1); //构造奇数阶
int Bi_Even_Construct(int,int*); //构造双偶阶
int Bi_Even_Construct_init(int ,int * ); //双偶阶初始化
int Bi_Even_Construct_Switch(int ,int * ); //双偶阶对调对角线
int init_quadrant_ABCD(int ,int *); //初始化各象限元素
int Swap_A_C(int n,int* ,int* ); //交换A,C象限
int Swap_B_D(int n,int* ,int* ) ; //交换B,D象限
void swap_no(int* ,int * ); //交换一个元素
int copy_quadrants_to_magic(int n,int* magic,
int* sub_magic_A,int* sub_magic_B,int* sub_magic_C,int* sub_magic_D);
//把ABCD各象限合并到magic
int Single_Even_Construct(int,int*); //构造单偶阶
int init_magic(int,int*); //初始化幻方
int print_magic(int,int*); //打印幻方
/**----------------------------------------------------------------------
主程序
-------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int n;
n=get_n(); //读入阶数n
int s=n*(n*n+1)/2; //计算幻和
printf("nS= %d",s);
int* magic=new int[n*n] ; //magic存n阶幻方,是整型指针,指向数组头
init_magic(n,magic); //将所有值初始化为0
if( n%2 == 1 ){
Odd_Construct(n,magic ); //构造奇数阶幻方
}else{
if( n%4 == 0 ){
Bi_Even_Construct(n,magic ); //构造双偶阶4k
}else{
Single_Even_Construct(n,magic ); //单偶阶4k+2
}
}
print_magic(n,magic ); //打印幻方
if(magic!=NULL){ //释放幻方内存
delete[] magic;
magic = NULL;
}
return 0;
}
/**--------------------------------
-读入阶数n,这里限制 n是为了n在一屏 显示下,其实可以增大之
---------------------------------*/
int get_n(){
int n;
do{
printf("请输入幻方阶数n
若n=5,则矩阵如下:
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
规则如下:n只能为奇数,则1的位置位于第一行中间,下一个数位于当前数的右上角,若超出行列范围,则循环进入下一行、列,当计数达到n的倍数时,下一个数位于当前数的正下方。
2 有0-9十个山洞,一只狼从第0个山洞开始寻找兔子。第一次隔一个山洞,第二次隔两个,第三次隔三个,第n次隔n个山洞,问最后有哪几个山洞没被狼找过?
下面这个只能是说是我想的第一题的算法,具体实现偶的基础实在是不好,找书也没有找到,拜托高手了
#include
main()
{
int i,k,l,n;
int u[k][l];
printf("输入一个正整数");
scanf("%d",&n);
for(i=1;i2,n阶幻方都存在。
目前填写幻方的方法,是把幻方分成了三类,每类又有各种各样的填写方法
本算法来自:http://blog.csdn.net/northwolves/archive/2007/09/23/1796696.aspx
---------------------------------------------------------------------*/
#include "stdafx.h"
#include
int get_n(); //读入阶数
int Odd_Construct(int,int*,int =1); //构造奇数阶
int Bi_Even_Construct(int,int*); //构造双偶阶
int Bi_Even_Construct_init(int ,int * ); //双偶阶初始化
int Bi_Even_Construct_Switch(int ,int * ); //双偶阶对调对角线
int init_quadrant_ABCD(int ,int *); //初始化各象限元素
int Swap_A_C(int n,int* ,int* ); //交换A,C象限
int Swap_B_D(int n,int* ,int* ) ; //交换B,D象限
void swap_no(int* ,int * ); //交换一个元素
int copy_quadrants_to_magic(int n,int* magic,
int* sub_magic_A,int* sub_magic_B,int* sub_magic_C,int* sub_magic_D);
//把ABCD各象限合并到magic
int Single_Even_Construct(int,int*); //构造单偶阶
int init_magic(int,int*); //初始化幻方
int print_magic(int,int*); //打印幻方
/**----------------------------------------------------------------------
主程序
-------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int n;
n=get_n(); //读入阶数n
int s=n*(n*n+1)/2; //计算幻和
printf("nS= %d",s);
int* magic=new int[n*n] ; //magic存n阶幻方,是整型指针,指向数组头
init_magic(n,magic); //将所有值初始化为0
if( n%2 == 1 ){
Odd_Construct(n,magic ); //构造奇数阶幻方
}else{
if( n%4 == 0 ){
Bi_Even_Construct(n,magic ); //构造双偶阶4k
}else{
Single_Even_Construct(n,magic ); //单偶阶4k+2
}
}
print_magic(n,magic ); //打印幻方
if(magic!=NULL){ //释放幻方内存
delete[] magic;
magic = NULL;
}
return 0;
}
/**--------------------------------
-读入阶数n,这里限制 n是为了n在一屏 显示下,其实可以增大之
---------------------------------*/
int get_n(){
int n;
do{
printf("请输入幻方阶数n