本文目录一览:
教你如何使用C语言编写简单小游戏
编写程序,实现如下表所示的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
5-魔方阵
问题分析
所谓“n-魔方阵”,指的是使用1〜n²共n²个自然数排列成一个n×n的方阵,其中n为奇数;该方阵的每行、每列及对角线元素之和都相等,并为一个只与n有关的常数,该常数为n×(n²+1)/2。
例如5-魔方阵,其第一行、第一列及主对角线上各元素之和如下:
- 第一行元素之和:17+24+1+8+15=65
- 第一列元素之和:17+23+4+10+11=65
- 主对角线上元素之和:17+5+13+21+9=65 而 n×(n²+1)/2=5×(5²+1)/2=65 可以验证,5-魔方阵中其余各行、各列及副对角线上的元素之和也都为65。 假定阵列的行列下标都从0开始,则魔方阵的生成方法为:在第0行中间置1,对从2开始的其余n²-1个数依次按下列规则存放:
- 假定当前数的下标为(i,j),则下一个数的放置位置为当前位置的右上方,即下标为(i-1,j+1)的位置。
- 如果当前数在第0行,即i-1小于0,则将下一个数放在最后一行的下一列上,即下标为(n-1,j+1)的位置。
- 如果当前数在最后一列上,即j+1大于n-1,则将下一个数放在上一行的第一列上,即下标为(i-1,0)的位置。
- 如果当前数是n的倍数,则将下一个数直接放在当前位置的正下方,即下标为(i+1,j)的位置。 算法设计 在设计算法时釆用了下面一些方法:
- 定义array()函数,array()函数的根据输入的n值,生成并显示一个魔方阵,当发现n不是奇数时,就加1使之成为奇数。
- 使用动态内存分配与释放函数malloc()与free(),在程序执行过程中动态分配与释放内存,这样做的好处是使代码具有通用性,同时提高内存的使用率。
- 在分配内存时还要注意,由于一个整型数要占用两个内存,因此,如果魔方阵中要存放的数有max个,则分配内存时要分配2max个单元,从而有malloc(max+max)。在malloc()函数中使用max+max而不是2max是考虑了程序运行的性能。
- 显然应该使用二维数组来表示魔方阵,但虽然数组是二维形式的,而由于内存是一维线性的,因此,在存取数组元素时,要将双下标转换为单个索引编号。在程序中直接定义了指针变量来指向数组空间,即使用malloc()函数分配的内存。
C语言做的魔方阵
下面是一个打印奇数阶魔方阵的程序:
#include<stdio.h>
int main()
{
int n=0, i, j, k=1, p, q, a[20][20]={0};
while(!(n%2))
{
printf("请输入一个小于20的奇数:");
scanf("%d", &n);
}
i = 0;
j = n/2;
for(p=0; p < n; p++)
{
for(q=0; q < n; q++)
{
if(q > 0)
{
i = (i + n - 1) % n;
j = (j + 1) % n;
}
a[i][j] = k++;
}
i = (i + 1) % n;
}
for(i=0; i < n; i++)
{
for(j=0; j < n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
C语言编程,输出魔方阵
程序代码:
#include<stdio.h>
#define N 16
int main()
{
int a[N][N]={0}, i, j, k, p, n;
p = 1;
while(p == 1)
{
printf("Enter n(1~%d):", N);
scanf("%d", &n);
if((n != 0) && (n < N) && (n % 2 != 0))
p = 0;
}
i = n + 1;
j = n / 2 + 1;
a[1][j] = 1;
for(k = 2; k <= n * n; k++)
{
i = i - 1;
j = j + 1;
if((i < 1) || (j > n))
{
i = i + 2;
j = j - 1;
}
else
{
if(i < 1) i = n;
if(j > n) j = 1;
}
if(a[i][j] == 0) a[i][j] = k;
else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
扩展资料:
- 第一行中间一列的值为1。
所以用j = n / 2 + 1
确定1的列数,得出a[1][j] = 1
。 - 每一个数存放的行比前一个数的行数减1,列数加1。
行数用i = i - 1
确定,列数用j = j + 1
确定。 - 如果一个数行数为第一行,则下一个数行数为最后一行。
- 如果一个列行数为最后一列,则下一个数列数为第一列。
- 如果按上面的规则确定的位置上已有数,或上一个数是第一行最后一列,则把下一个数放在上一个数的下面。
c语言输出魔方阵程序解释
首先魔方阵是一个奇数行列式方阵,它的一行,一列,对角线的和都相等。
建立魔方阵的第一步是确定1的位置,它是第一行的中间列,之后要确定其他位置的值。
问题1:
if((i < 1) || (j > n))
时,说明你确定的位置已经超出了魔方阵,所以要用i = i + 2; j = j - 1;
把它拉回魔方阵内。
问题2:
判断第i行第j列的值是否等于0(即是否被填充),如果没填充,就填k,如果填充,再寻找下一个位置。
问题3:
因为你的主函数main()前面的返回值为int,所以要提供返回值,那不是return=0
,而是return 0;
。也可以返回1,这没关系的,如果不想要也行,那得把main()前面的int改为void。
C语言实现魔方游戏,六面能转的
将每一组数都放在空间数组(也许,很快就研究出来啦,呵呵)里,实现数组中数据的转换。
main()
{
int a[3][3][3]; /*将数据放在六块区域中(这里每行3数哈)*/
while(1) /*实现无限循环*/
{
a[2][2] = a[2][][2]; /*中间数据变换*/
a[2][2] = a[][2][2]; /*中间数据变换*/
a[3][3][3] = a[][][]; /*空间每一点均可变换*/
}
}