| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 782 人关注过本帖
标题:转圈矩阵的算法:鄙人写了一个傻瓜式的,
只看楼主 加入收藏
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
转圈矩阵的算法:鄙人写了一个傻瓜式的,
昨天下午在论坛看某人贴了一个这个问题后,很好奇这个东西,就一直想.....无奈本人毕业三年,什么东西都忘记了,  前几天才重新拿起书,重新复习;所以很艰难啊

思索了一个小时无果后,果断睡觉,可是睡着睡着,突然来了感觉,,就开始写代码,,,午夜写完后,运行下,有错,果断睡觉,; 今天早上起来,重新修改,仔细的想了过程,归纳了下,,终于搞定啊,,,心里还是蛮高兴的啊......
以下为代码,不是很简练,见笑了,感觉还是很傻瓜式的方法:


#include<stdio.h>
#include<math.h>

#define n 9    //改变N的值,可以改变这个矩阵的阶数:即每行为N个数可以改变,这个矩阵分奇偶数哦
               //N矩阵的圈数等于N模2(中心对称点不算圈)

                          // 注意:每圈分为:"上行",到 "右列",再到 "下行",再到 "左列",结束
           
                                            //  K从0开始,第K圈时:  第K圈的每个数大致如下:从a[k][k]开始,到a[k+1][k]结束
                                            //   第K圈:  a[k][k]、、、、、->、、、、、a[k][n-1-k]
                                            //          a[k+1][k]                        
void  main()                                //                a[k+1][k+1]、、> 、      |
{                                           //                 、第(k+1)圈          \ /
   int i,t,j,m,k;                           //            / \                         
   int a[n][n];                             //             |      、、、、<、、、 、         
   a[0][0]=0;                               //                                         
   t=0;                                     //         a[n-1-k][k]、、、、<-、、、、、、 a[n-1-k][n-1-k]
   m=n/2;                               //     k的最大值为m-1
   if(n==1) printf("n不能为1!你可以自己手工画矩阵看,此时为一个点\n");
   else
   {
   k=0;                               //K,m表示圈数k表示的是每次循环赋值时的实时圈数  m表示的是总圈数
   for(j=1;j<=m;j++)                  //J,k表示这个循环要对第几圈进行赋值,k从0开始直到k变为等于m-1结束(此时j==m,注意:是J先等于m 然后k才结果一轮循环后等于m-1)
   {                                  //因为每行和相邻的列有重合点,所以特别要注意  每行或  每列  的第一个数的赋值的特殊性
          for(t=k;t<n-1-k;t++)            //上行  :只输入第k个到第n-2-k个数,即只赋值n-1-2k个数!   从左到右
              if(t==0&&k==0) a[k][t]++;                 // 特殊点:每轮只执行一次
              else  a[k][t]=a[k][t-1]+1;
        
          for(i=k;i<n-k-1;i++)            //右列     第n-k-1列赋值  从上到下
               if(i==k)  a[i][n-1-k]=a[i][n-1-k-1]+1;    //特殊点:对 该列 第一个数赋值,该循环只执行一次这个语句
               else  a[i][n-1-k]=a[i-1][n-1-k]+1;
          for(i=n-k-1;i>=k;i--)           //下行     第n-k-1 行赋值  从右到左
               if(i==n-k-1)  a[n-1-k][i]=a[n-1-k-1][i]+1;            //特殊点:对 该行 第一个数赋值,该循环只执行一次这个语句
               else a[n-1-k][i]=a[n-1-k][i+1]+1;
          for(i=n-2-k;i>k;i--)            //左列     第k 列赋值,从下往上
                       a[i][k]=a[i+1][k]+1;
          k++;      
      
   }
   if(n%2==1)           //当它是奇数时,矩阵有一个中心点a[m][m]还没赋值;;;当它是偶数时,没有中心点
           a[m][m]=a[m][m-1]+1;          //(中心点:这个矩阵以这个中心点为对称中心,每个数都存在一个和它相对称的数)
   for(i=0;i<n;i++)         //输出整个矩阵
   {
          for(j=0;j<n;j++)
              printf("%2d  ",a[i][j]);
          putchar('\n');
   }
   }                     //其他方向循环:调整下赋值循序和数组的行标列标即可:例如顺时针变为逆时针
}
收到的鲜花
  • TonyDeng2012-08-19 12:37 送鲜花  5朵   附言:精神可嘉,鼓励一下!
搜索更多相关主题的帖子: include 东西 
2012-08-19 11:16
justNPC
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:311
注 册:2012-8-11
收藏
得分:7 
写的思路和我的差不多
2012-08-19 12:21
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:7 
楼主辛苦了!
把编程当作游戏来玩,虽苦也乐啊!

楼主能不能把“转圈矩阵的算法”的原题要求贴出来,方便大家与你交流。

做自己喜欢的事!
2012-08-19 12:24
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
收藏
得分:0 
题目啊; 任意输入一个正整数,来输出一个二维数组a[n][n]:他们的值为1,从a[0][0]:开始,按顺时钟方向,每次累加1,(每个a[i][i]不能被重新赋值,),形成一个二维数组


那段代码,改几个,把行标和列标互换,把行,列的赋值顺序调整,就可以变成 逆时针转圈矩阵了
2012-08-19 12:35
姻脂梦
Rank: 6Rank: 6
等 级:侠之大者
帖 子:264
专家分:424
注 册:2012-7-3
收藏
得分:7 
楼主又要成为一代大师了
2012-08-19 12:55
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:0 
谢谢楼主!
按你给的题目,我换了一个思路,也写了一个代码,与楼主交流一下!

#include "stdio.h"
#define n 8
void  main(){
    int i,t,j,m,k=1;
    int ii=0,jj=0;
    int a[n][n];
    for(m=n-1;m>0;m-=2){
        i=ii++;j=jj++;
        for(t=0;t<m*4;t++){
            a[i][j]=k++;
            switch(t/m){
                case 0:j++;break;
                case 1:i++;break;
                case 2:j--;break;
                case 3:i--;break;
            }
        }
    }
    if(m==0)a[n/2][n/2]=k;
    clrscr();
    for(i=0;i<n;i++){
        printf("\n");
        for(j=0;j<n;j++)
            printf("%4d",a[i][j]);
        printf("\n");
    }
    getch();
}
不好意思,因为时间关系,我没有加注释。


[ 本帖最后由 netlin 于 2012-8-19 14:39 编辑 ]

做自己喜欢的事!
2012-08-19 14:36
上帝的忏悔书
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-26
收藏
得分:0 
include "stdio.h"
 #define n 8
 void  main(){
     int i,t,j,m,k=1;
     int ii=0,jj=0;
     int a[n][n];
     for(m=n-1;m>0;m-=2){
         i=ii++;j=jj++;
         for(t=0;t<m*4;t++){
             a[i][j]=k++;
             switch(t/m){
                 case 0:j++;break;
                 case 1:i++;break;
                 case 2:j--;break;
                 case 3:i--;break;
             }
         }
     }
     if(m==0)a[n/2][n/2]=k;
     clrscr();
     for(i=0;i<n;i++){
         printf("\n");
         for(j=0;j<n;j++)
             printf("%4d",a[i][j]);
         printf("\n");
     }
     getch();
 }
2012-11-29 13:03
快速回复:转圈矩阵的算法:鄙人写了一个傻瓜式的,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029482 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved