论坛: 编程破解 标题: 关于魔方阵的.tc 复制本贴地址    
作者: Angel [cike]    论坛用户   登录
8 3 4

1 5 9

6 7 2
小弟虽然看了原程序,但还是百思不得其解
求哪位大哥能给我分析一下
让我明白里面的思路

地主 发表时间: 04-07-20 11:24

回复: sniper167 [sniper167]   论坛用户   登录
就是让这个3*3矩阵的8条直线(横3,竖3,斜2)上的三个数字之和为15

B1层 发表时间: 04-07-20 11:46

回复: Angel [cike]   论坛用户   登录
恩!!!
是定义它的坐标吗?

B2层 发表时间: 04-07-20 14:15

回复: sniper167 [sniper167]   论坛用户   登录
什么定义坐标?
没搞懂你想问什么,你把源程序贴出来嘛,说哪里看不懂,这样好办点。

另外看看这个贴,可能对你有帮助        “这个数组怎样排?”


[此贴被 啥都不会(sniper167) 在 07月20日17时56分 编辑过]

B3层 发表时间: 04-07-20 17:55

回复: Angel [cike]   论坛用户   登录
#define N9
#include "stdio.h"
main()
{int j,i,k,a[N][N];
for(i=0;i<N;i++)
  for(j=0;j<N;j++)
    a[i][j]=0;
      j=N/2;    // 这句话是什么意思?
      a[0][j]=1;
  for(k=2;k<=N*N;k++)    // 不懂
{
  i--;
  j++;
if (i < 0)
i=n-1;
else if (i > N-1)
j=0;
if (a[i][j]==0
a[i][j]=k;
else
{i=(i+2)%N;
j=(j-1+N)%N;
a[i][j]=k;
  }
}
printf("\n\n");
for (i=0; i<N;i++)
{
printf("\t");
for(j=0;j<N;j++)
  printf("%4d",a[i][j];
printf("\n\n");
}
return;
}




以上是原码,可是我还是有很多地方看不懂
给点提示好吗?





[此贴被 Angel(cike) 在 07月21日18时49分 编辑过]


[此贴被 Angel(cike) 在 07月22日08时32分 编辑过]

B4层 发表时间: 04-07-21 14:58

回复: SilentSlave [silent]   论坛用户   登录
1:你自己写的还是复制粘贴的?n多的错误.
2:你先看这个dd:
引用:
容易理解魔方阵源程序 



发表日期:2004年7月5日  出处:自创  作者:甄瞳  已经有855位读者读过此文



所谓魔方阵是指这样的的方阵:

它的每一行、每一列和对角线之和均相等。

输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。

例如,当n=3时,魔方阵为:

8  1  6

3  5  7

4  9  2

  此题要求输入一个数据n,然后打印出奇数阶魔方阵。要打印出奇数阶魔方阵,首先要明白奇数阶魔方阵的生成方法。其生成方法如下:

(1) 第一个位置在第一行正中;

(2) 新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,如超出右边界则新位置取应选行的最左一个位置;

(3) 若最近一个插入元素为N的整倍数,则选下面一行同列上的位置为新位置。

  了解了其生成方法,就可以根据此方法来写出程序。首先设置int变量i,j,m,n。将从键盘输入的数据存入地址&n。然后再设置int数组a[MAX][MAX],由于数组在定义时,必须设置其宽度。所以在开始时定义MAX的大小,以后当出入的数字大于MAX时只需改动MAX即可。在此先设置为15。而根据生成方法可写出下列程度来实现对魔方阵的排列:



i=0,j=(n+1)/2-1;      /*代表第一行最中间的一列*/

while(m<=n*n)            /*一共n*n个数*/

{

    a[i][j]=m;

m++,i--,j++;      /*i--,j++;代表下一个数在原来那个数的右上方*/

if((m-1)%n==0&&m>=1)          /* ( 1 )  */

i=i+2,j=j-1;                  /*(2)*/

if(i<0) i=i+n;            /*超出上界则i+n*/

if(j>(n-1)) j=j-n;        /*超出右边界则j-n*/

}



注释(1)其根据为第三个要求。当m-1为5的整数倍时,其位置为上一个数位置的同一列下面一行,由于当m=1时(m-1)%n=0,但不用遵循其要求所有用 if( (m-1)%n==0&&m>=1)加以限制。

注释(2)由于在执行这一步之前经历了i--,j++。则要使之位置为原来的下方则i+2,j-1; 最后利用循环语句输出结果。

其程序为:

#define MAX 15

#include <stdio.h>

main()

{ int n;

int m=1;

int i,j;

int a[MAX][MAX];

clrscr();

scanf("%d",&n);

i=0,j=(n+1)/2-1;

while(m<=n*n)

{

      a[i][j]=m;

m++,i--,j++;

if((m-1)%n==0&&m>1)

i=i+2,j=j-1;

if(i<0) i=i+n;

if(j>(n-1)) j=j-n;

}

for(i=0;i<n;i++)

      for(j=0;j<n;j++)

        { if(a[i][j]/10==0)

        printf("%d  ",a[i][j]);    /*对程序无影响,只是使输出的数

      else printf("%d  ",a[i][j]);          每一列对齐*/

        if(j==(n-1)) printf("\n");}



}






B5层 发表时间: 04-07-22 09:42

回复: SilentSlave [silent]   论坛用户   登录
下面是我的理解:这个dd很破(改了n多地方)
#define N 3
#include "stdio.h"
main()
{int j,i,k,a[N][N];
for(i=0;i<N;i++)
  for(j=0;j<N;j++)
    a[i][j]=0;/*首先把所有的数组元素都设为0*/
      j=N/2;  /*由于N=3,所以j=1*/ 
      a[0][j]=1;/*把第一行的中间的数设为1*/
  for(k=2;k<=N*N;k++) /*开始循环*/
{ i--;/*利用在右上角的条件,所以i--,j++*/
  j++;
if (i < 0)
i=N-1;
else if (j > N-1)
j=0;
if (a[i][j]==0)
a[i][j]=k;
else
{i=(i+2)%N;
j=(j-1+N)%N;
a[i][j]=k;
  }
}
printf("\n\n");
for (i=0; i<N;i++)
{
printf("\t");
for(j=0;j<N;j++)
  printf("%4d",a[i][j]);
printf("\n\n");
}
return;
}
有点乱七八糟的.

B6层 发表时间: 04-07-22 09:45

回复: Angel [cike]   论坛用户   登录
是书上的例题\
谢谢你了!!!
非常感谢

B7层 发表时间: 04-07-22 14:42

回复: Angel [cike]   论坛用户   登录
这种文章在哪个网站可以找得到啊?
告诉我啊!!!!


B8层 发表时间: 04-07-22 15:22

回复: SilentSlave [silent]   论坛用户   登录
可惜我的E文不好 http://www.cplusplus.com

B9层 发表时间: 04-07-22 21:49

回复: Angel [cike]   论坛用户   登录
有没有c文的?
看不懂啊!!!

B10层 发表时间: 04-07-23 09:30

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号