由具体到抽象设计循环结构

  编写算法:根据参数n打印具有下面规律的图形,如,当n=4时,图形如下:

   1             

   5 2          

   8 6 3       

   10 9 7 4  

  问题分析:容易发现图形中数据排列的规律。  

  方法一:                                       

     先用一个数组按此顺序存储数据,再正常输出;

 用斜行、列描述新的循环方向。  斜行i取值(1~n)   j取值(1~n+1-i)

 关键问题:第i斜行、j列的数据对应于第几行第几列的元素

[11]—a[1,1]     [21]—a[2,1]     [31]—a[3,1]     [41]—a[4,1]

[12]—a[2,2]     [22]—a[3,2]     [32]—a[4,2]

[13]—a[3,3]     [23]—a[4,3]

[14]—a[4,4]

 à列号相同;

 à行号(显然行号与列号有关)

 第1斜行,对应行号1—n,行号与列号j同;

 第2斜行,对应行号2—n,行号比列号j1

 第3斜行,对应行号3—n,行号比列号j2

代码如下:

View Code
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i,j,k,n,a[100][100];
 6     while(cin>>n)
 7     {
 8         k=1;
 9         for(i=1;i<=n;i++)
10             for(j=1;j<=n+1-i;j++)
11             {
12                 a[i-1+j][j]=k;
13                 k++;
14             }
15             for(i=1;i<=n;i++)
16             {
17                 for(j=1;j<=i;j++)
18                     if(j==1) cout<<a[i][j];
19                     else cout<<" "<<a[i][j];
20                     cout<<endl;
21             }
22         cout<<endl;
23     }
24     return 0;
25 }

方法二: 

     还是考虑从数据间找规律

        

     首先主对角线元素与其数组下标数值一致。如a[3][3]=3

      沿紫色箭头看,每条斜线数据与其上方斜线数据所差数值相同,且差值为上方斜线包含的数的个数。

    由于是斜线方向的规律,循环如按行处理,仍然不能简单构造循环体。[可行,但相对复杂]

    再观察,对于3条相邻斜线上数值的差,正好相差1[为什么?]因此如果循环如按列处理,可得到同一列相邻元素间关系

   a[i][j]=a[i-1][j]+k;k随矩阵行号增加递减。

      为什么相差1由每个对角线包含数据个数决定

 代码如下:

View Code
 1 #include<iostream>
 2 //#include<string>
 3 using namespace std;
 4 int main()
 5 {
 6     int i,j,n,a[100][100],k;
 7     //memset(a,0,sizeof(a));
 8     while(cin>>n)
 9     {
10         for(i=1;i<=n;i++)
11             a[i][i]=i;
12         for(j=1;j<=n;j++)
13         {
14             k=n;
15             for(i=j+1;i<=n;i++)
16             {
17                 a[i][j]=a[i-1][j]+k;
18                 k--;
19             }
20         }
21         for(i=1;i<=n;i++)
22         {
23             for(j=1;j<=i;j++)
24              if(j==1) cout<<a[i][j];
25              else cout<<" "<<a[i][j];
26             cout<<endl;
27         }
28         cout<<endl;
29     }
30     return 0;
31 }

 

posted @ 2011-10-08 19:07  笑巧  阅读(417)  评论(0编辑  收藏  举报