CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

如何打印以下图形!!

楼主leilei821006()2006-10-24 01:33:35 在 C/C++ / C语言 提问

从键盘接受一个数字,然后输出图形。例如:(选做)  
  输入数字6,则输出:  
  1  
  2   15  
  3   16   14  
  4   17   21   13  
  5   18   19   20   12  
  6   7     8     9     10   11  
  问题点数:20、回复次数:21Top

1 楼leilei821006()回复于 2006-10-24 13:32:01 得分 0

没人知道吗??Top

2 楼Bennyatt()回复于 2006-10-24 13:52:41 得分 0

看出规律了。。。但是我不一定有时间给你编。  
  如果有时间一会就给你把代码贴上  
  Top

3 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-10-24 14:01:12 得分 0

感觉就是一个多重循环问题  
  可以申请一个动态的二维数组  
  比如已知6  
  就知道是什么结构了  
  再给每位置赋值,或者找规律通过计算赋值Top

4 楼Bennyatt()回复于 2006-10-24 14:05:22 得分 0

正写这个代码呢,很长时间不做C了  
  现在做的是PHP项目   。  
  忙里偷闲,个C的程序锻炼大脑。。。  
  Top

5 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:44:16 得分 0

请搜索     螺旋矩阵    
   
  这个三角矩阵是   螺旋矩阵的变体   而已Top

6 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:46:54 得分 5

一个   螺旋矩阵程序   :  
  #include   <stdio.h>  
  #define   N   8  
  main(){  
    int   i,j,n=1,a[N][N];  
    for(i=0;i<=N/2;i++){  
      for(j=i;j<N-i;j++)  
        a[i][j]=n++;  
      for(j=i+1;j<N-i;j++)  
        a[j][N-i-1]=n++;  
      for(j=N-i-2;j>i;j--)  
        a[N-i-1][j]=n++;  
      for(j=N-i-1;j>i;j--)  
        a[j][i]=n++;  
    }  
    for(i=0;i<N;i++){  
      printf("\n\n");  
      for(j=0;j<N;j++)  
        printf("%5d",a[i][j]);  
    }  
  }Top

7 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:48:19 得分 0

http://tuxw.spaces.live.com/Blog/cns!1p1KRL2snDHMdTagFMfJCgKg!146.entry  
   
  ============  
  PS   :   “本题解决方法很多,在   CSDN   看到     steedhorse(晨星)   写的一段代码...”  
  看来老大的影响力还是很大的   ~~~~~~Top

8 楼jixingzhong(瞌睡虫·星辰)回复于 2006-10-24 14:52:04 得分 0

这里有一个   上三角螺旋矩阵:  
   
  #include   <iostream.h>  
  #include   <iomanip.h>  
  #include   <stdio.h>  
  #define   m   20  
  #define   h(i,j)   ((2*c+2-i)*(i-1)/2+j-i+1)     //二维数组中元素在一维数组中的位置  
  main()  
  {   int   i=1,j=0,s=0,k,n,c;  
      int   a[m*(m+1)/2+1];                                    
      a[1]=1;  
      printf("please   input   the   number\n");  
      scanf("%d",&n);         //这里输入   6   即可  
      c=n;  
      while(n>0)  
        {  
          for(k=1;k<=n;k++){j++;a[h(i,j)]=++s;}n--;//横向赋值  
          for(k=1;k<=n;k++){i++;a[h(i,j)]=++s;}n--;//纵向赋值  
          for(k=1;k<=n;k++){j--;i--;a[h(i,j)]=++s;}n--;//斜向赋值  
        }  
  k=0;  
  for(i=1;i<=c;i++)  
  for(j=1;j<=c;j++)  
  {  
    if(i>j)  
    cout<<setw(4)<<"0";  
    else  
    if(j==c){k++;   cout<<setw(4)<<a[k]<<endl;   }   else   {k++;cout<<setw(4)<<a[k];}  
    }    
  }  
  Top

9 楼buguty(系统级别)回复于 2006-10-24 15:16:44 得分 5

#include   <stdio.h>  
  #include   <windows.h>  
   
  void   main(void)  
  {  
  int iLineNum;  
  int** iArry;  
   
  printf("请输入一个数字:\n");  
  scanf("%d",   &iLineNum);  
   
  iArry   =   (int**)malloc(iLineNum*sizeof(int*));  
   
  for   (int   i=0;   i<iLineNum;   ++i)  
  {  
  iArry[i]   =   (int*)malloc(iLineNum*sizeof(int));  
  memset(iArry[i],   0,   iLineNum*sizeof(int));  
  }  
   
  int   iVal   =   1;  
  int   iLie   =   0;  
  int   iHan   =   -1;  
  int   iLieAdd   =   0;  
  int   iHanAdd   =   1;  
  int   flag   =   0;  
  for   (int   i=iLineNum;   i>0;   --i)  
  {  
  for   (int   j=1;   j<=i;   ++j)  
  {  
  iLie+=iLieAdd;  
  iHan+=iHanAdd;  
  iArry[iHan][iLie]   =   iVal;  
  ++iVal;  
  }  
   
  switch(flag%3)  
  {  
  case   0:  
  iLieAdd   =   1;  
  iHanAdd   =   0;  
  ++flag;  
  break;  
  case   1:  
  iLieAdd   =   -1;  
  iHanAdd   =   -1;  
  ++flag;  
  break;  
  case   2:  
  iLieAdd   =   0;  
  iHanAdd   =   1;  
  ++flag;  
  break;  
  }  
  }  
   
  printf("\n");  
  for   (int   i=0;   i<iLineNum;   ++i)  
  {  
  for   (int   j=0;   j<i+1;   ++j)  
  {  
  printf("%-3d",   iArry[i][j]);  
  }  
  printf("\n");  
  }  
  }  
   
  在vc2005下调试通过。。。Top

10 楼buguty(系统级别)回复于 2006-10-24 15:19:01 得分 0

结果:  
  请输入一个数字:  
  10  
   
  1      
  2     27    
  3     28   26    
  4     29   45   25    
  5     30   46   44   24    
  6     31   47   54   43   23    
  7     32   48   55   53   42   22    
  8     33   49   50   51   52   41   21    
  9     34   35   36   37   38   39   40   20    
  10   11   12   13   14   15   16   17   18   19Top

11 楼buguty(系统级别)回复于 2006-10-24 15:33:19 得分 0

请输入一个数字:  
  20  
   
  1        
  2       57      
  3       58     56      
  4       59     105   55      
  5       60     106   104   54      
  6       61     107   144   103   53      
  7       62     108   145   143   102   52      
  8       63     109   146   174   142   101   51      
  9       64     110   147   175   173   141   100   50      
  10     65     111   148   176   195   172   140   99     49      
  11     66     112   149   177   196   194   171   139   98     48      
  12     67     113   150   178   197   207   193   170   138   97     47      
  13     68     114   151   179   198   208   206   192   169   137   96     46      
  14     69     115   152   180   199   209   210   205   191   168   136   95     45      
  15     70     116   153   181   200   201   202   203   204   190   167   135   94     44      
  16     71     117   154   182   183   184   185   186   187   188   189   166   134   93     43      
  17     72     118   155   156   157   158   159   160   161   162   163   164   165   133   92     42      
  18     73     119   120   121   122   123   124   125   126   127   128   129   130   131   132   91     41      
  19     74     75     76     77     78     79     80     81     82     83     84     85     86     87     88     89     90     40      
  20     21     22     23     24     25     26     27     28     29     30     31     32     33     34     35     36     37     38     39      
  Top

12 楼Bennyatt()回复于 2006-10-24 15:47:12 得分 10

我最近比较忙,刚弄出来了。  
  故意给你留了   几个问题让你解决哦,  
  而且明显还有几个多余的变量,你可以常识优化一下。  
  #include<stdio.h>  
  #include<iostream.h>  
  #include<iomanip.h>  
  int   arr[100][100];  
  int   tn,len,dn,un,rn;  
  int   aa=1;  
  void   opright(int   x,int   y);  
  void   opup(int   x,int   y);  
  void   opdown(int   x,int   y)  
  {  
  if(dn>=0)  
  {  
  for(int   i=0;i<=dn;i++)  
  {  
  arr[x+i][y]=aa;  
  aa++;  
  len--;  
  if(len<=0)  
  {  
  break;  
  }  
  }  
  dn=dn-3;  
  opright(x+i-1,y+1);  
  }  
   
  }  
  void   opright(int   x,int   y)  
  {  
  if(rn>=0)  
  {  
  for(int   i=0;i<=rn;i++)  
  {  
  arr[x][y+i]=aa;  
  aa++;  
  len--;  
  if(len<=0)  
  {  
  break;  
  }  
  }  
  rn=rn-3;  
  opup(x-1,y+i-1-1);  
  }  
  }  
  void   opup(int   x,int   y)  
  {  
  if(un>=0)  
  {  
  for(int   i=0;i<=un;i++)  
  {  
  arr[x-i][y-i]=aa;  
  aa++;  
  len--;  
  if(len<=0)  
  {  
  break;  
  }  
  }  
  un=un-3;  
  opdown(x-i+1+1,y-i+1);  
  }  
  }  
  int   getlen(int   n)  
  {  
  if(n==1)  
  {  
  return(1);  
  }  
  else  
  {  
  return   (n+getlen(n-1));  
  }  
  }  
  void   main()  
  {  
  cin>>tn;  
  len=getlen(tn);  
  dn=tn-1;  
  rn=dn-1;  
  un=rn-1;  
  opdown(0,0);  
  for(int   i=0;i<tn;i++)  
  {  
  for(int   j=0;j<=tn;j++)  
  {  
  cout<<setw(4)<<arr[i][j]<<"   ";  
  }  
  cout<<endl;  
  }  
  }Top

13 楼Bennyatt()回复于 2006-10-24 15:55:15 得分 0

我这个似乎最长。。。最通俗了。。。  
  嘿嘿,我忙去了Top

14 楼leilei821006()回复于 2006-10-24 16:47:22 得分 0

 
  Bennyatt()   (   )   信誉:100         Blog    
   
  谢谢了  
   
  大家能说下思路吗?代码不是很重要了,先写过大家了Top

15 楼leilei821006()回复于 2006-10-24 16:50:28 得分 0

看了前面的代码,有点思路了。  
  是不通过控制   竖行,横行,斜行来打印出图形!!Top

16 楼buguty(系统级别)回复于 2006-10-24 17:15:10 得分 0

我的再改下。。。  
  for   (int   i=0;   i<iLineNum;   ++i)  
  {  
  iArry[i]   =   (int*)malloc((i+1)*sizeof(int));  
  memset(iArry[i],   0,   (i+1)*sizeof(int));  
  }Top

17 楼buguty(系统级别)回复于 2006-10-24 17:19:01 得分 0

我的思路先:  
  比如我他的增长是从n,n-1,n-2...的长度然后转方向。所以我就用这种方法用数组来解决。当  
  1  
  2  
  3  
  4  
  5  
  6  
  的时候就是每次行数加一。列不加所以我就  
  当7   8   9   10   11的时候是行列加一。当。。。的时候就是行和列都减一。。。就是了Top

18 楼leilei821006()回复于 2006-10-25 01:28:06 得分 0

谢谢各位了!!  
   
  buguty(系统级别)   (   )   信誉:100          
   
  看了你的思路,使我尝试的也了个!!Top

19 楼leilei821006()回复于 2006-10-25 01:33:13 得分 0

/*从键盘接受一个数字,然后输出图形。例如:(选做)  
  输入数字6,则输出:  
  1  
  2   15  
  3   16   14  
  4   17   21   13  
  5   18   19   20   12  
  6   7     8     9     10   11  
  */  
   
  #include<stdio.h>  
   
   
  int   g_nArray[100][100]   =   {{0}}; //二维数组来存储数字  
  int   g_nNum   =   1; //输入的数字,进行累加  
   
   
  void   Downwards(int   nX,int   nY,   int   nCount); //向下计算函数  
  void   Rightward(int   nX,int   nY,   int   nCount); //向右计算函数  
  void   Oblique(int   nX,int   nY,   int   nCount); //斜上计算函数  
   
   
   
  void   main()  
  {  
  int   nCount   =   0; //打印数字的次数  
   
  while(1)  
  {  
  printf("请输入行数(1--20):");  
  scanf("%d",   &nCount);  
   
  if(nCount   >   20)  
  {  
  printf("输入的行数太大,屏幕无法显示,请重新输入!\n");  
  }  
  else  
  {  
  break;  
  }  
   
  }  
   
  Downwards(0,   0,   nCount);  
   
  for(int   nI=0;   nI   <   nCount;   nI++)//打印数组,如数据为0,则打印空格,其他输出  
  {                                                               //数据  
  for(int   nJ=0;   nJ<nCount;   nJ++)  
  {  
  if(g_nArray[nI][nJ]   ==   0)  
  {  
  printf("   ");  
  }  
  else  
  {  
  printf("%4d",   g_nArray[nI][nJ]);  
  }  
  }  
   
  printf("\n");  
  }  
  }  
   
   
  void   Downwards(int   nX,int   nY,   int   nCount) //向下计算函数  
  {  
  if(nCount   >   0) //打印的个数大于0时,运行下列语句  
  {  
  for(int   nI   =   0;   nI   <   nCount;   nI++)  
  {  
  g_nArray[nX   +   nI][nY]   =   g_nNum;//列数不变,行数+1进行赋值  
  g_nNum++;  
   
  }  
   
  Rightward(nX   +   nI   -   1,   nY   +   1,   nCount   -   1);//将下个点的起始位置传 }             //输给Rightward()  
  }                                                                                                                         //下个点的起始位置为行  
                                                                                                                            //数不变,列数+1  
   
   
   
  void   Rightward(int   nX,int   nY,   int   nCount) //向右计算函数  
  {  
  if(nCount   >   0)  
  {  
  for(int   nI   =   0;   nI   <   nCount;   nI++)  
  {  
  g_nArray[nX][nY   +   nI]   =   g_nNum;//行数不变,列数+1进行赋值  
  g_nNum++;  
   
  }  
   
  Oblique(nX   -   1,   nY   +   nI   -   1   -   1,   nCount   -   1); //将下个点的起始位置  
  } //传输给Oblique()下个  
  }                                                                                                                             //点的起始位置为  
                                                                                                                                //行数-1,列数-1  
   
   
   
   
  void   Oblique(int   nX,int   nY,   int   nCount) //斜上计算函数  
  {  
  if(nCount   >   0)  
  {  
  for(int   nI   =   0;   nI   <   nCount;   nI++)  
  {  
            g_nArray[nX   -   nI][nY   -   nI]   =   g_nNum;//行数-1,列数-1进行赋值  
            g_nNum++;  
  }  
   
  Downwards(nX   -   nI   +   1   +   1,   nY   -   nI   +   1,   nCount   -   1);//将下个点的起 }             //始位置传输给  
  }                                                                                                                                         //Downwards()下  
                  //个点的起始位置为行数+1,列数不变  
   
   
   
  Top

20 楼Bennyatt()回复于 2006-10-25 09:59:51 得分 0

好的我现在给大家说思路。。。。  
  我   5:30下班了就走人了。。。。家里电脑不能上网。  
  思路吗。。  
  首先我认为“画”这个图分三部分  
  1向下画  
  2向左画  
  3想斜上画  
  我们的存储实体就是   个二维数组,  
  我们就是要定义“画笔”如何走路,首先我们要通过实例观察分析  
   
  1  
  2   15  
  3   16   14  
  4   17   21   13  
  5   18   19   20   12  
  6   7     8     9     10   11  
  这个阵,  
  向下画的操作每次“画”的个数字是  
  1   2   3   4   5   6////   16   17   18   //  
   
  向左画的操作每次“画”的个数字是  
  7   8   9   10   11///19     20//  
  向斜上画的操作每次“画”的个数字是  
  12   13   14   15//21    
  那么发现如下规律,其中每次递减的个数是3  
  所以呢我现在   用了三个函数  
  opright     向左画,opup向上画,opdown。。。。  
  8好了。。我的顶头上司来脆我了。。。。Top

21 楼Gxjun27168()回复于 2006-10-25 13:23:34 得分 0

解决的方法多了,关键是看谁的方法效率高,用的循环少。Top

相关问题

关键词

得分解答快速导航

  • 帖主:leilei821006
  • jixingzhong
  • buguty
  • Bennyatt

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo