| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 356 人关注过本帖
标题:求助,有哪位大神可以帮我解决方阵填数问题
只看楼主 加入收藏
lhhx
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-6-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
求助,有哪位大神可以帮我解决方阵填数问题
我的目的是为了算出一个方阵:
1  2  3  4  5   6  7  8  9  10
36 37 38 39 40  41 42 43 44 11
35 64 65 66 67  68 69 70 45 12
34 63 84 85 86  87 88 71 46 13
33 62 83 96 97  98 89 72 47 14
31 61 82 95 100 99 90 73 48 15
32 60 87 94 93  92 91 74 49 16
30 59 80 79 78  77 76 75 50 17
29 58 57 56 55  54 53 52 51 18
28 27 26 25 24  23 22 21 20 19
请问哪里错了,我写的代码为:
#include <stdio.h>
#include <stdlib.h>
#define N 10
enum DIRECTIONS {DOWN=0, RIGHT=1, UP=2, LEFT=3}; //4个方向
int gMtrx[N][N]; //固定大小的方阵
/*【功能】打印输出方阵
【输入】int *mtrx:将方阵看成一个一维数组所对应的数组首地址
    int n:方阵的行数
【输出】无*/
void printMtrx(int *mtrx, int n)
{
    int i, j;
    for(i=0; i<n; i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%5d  ", *(mtrx+i*n+j));
        }
        printf("\n");
    }
}

/*【功能】按方式A填充矩阵
【输入】int *mtrx:将方阵看成一个一维数组所对应的数组首地址
int n:方阵的行数
【输出】无*/
void fillA(int *mtrx, int n)
{
    int wThickness[4]={0, 0, 0, 0}; //wall thickness,将矩阵的外圈已填充了数字的看成一堵“墙”,wThickness存储了墙的厚度
    int i, j;
    int nStep;
    int direct;
    int row, col;

    i=1;
    direct=/*DOWN; //初始方向是“下”*/RIGHT;//初始方向是RIGHT
    row=-1, col=0; //记住当前的行和列的位置
    while(i<=n*n) //n*n cells in total to be filled,从数字1开始,总共将n*n个数字(1, 2, 3, ...)填入矩阵
    {
        //printf("i=%d\n",i);
        //getchar();
        switch(direct) //处理不同的方向
        {
        /*case DOWN: //下
            nStep=n-(wThickness[DOWN]+wThickness[UP]); //往下能走多少格?方阵的行数减去上方和下方墙的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
                row++;
                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i
                i++;
            }
            wThickness[LEFT]++; //左侧的墙的厚度增加1
            break;
        */
        case RIGHT: //右
            nStep=n-(wThickness[RIGHT]+wThickness[LEFT]); //往右能走多少格?方阵的列数减去右侧和左侧的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
                col++;
                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i;
                i++;
            }
        /*    wThickness[DOWN]++; //下方的墙的厚度增加1*/
            wThickness[UP]++; //上方的墙的厚度增加1
            break;


            case DOWN: //下
            nStep=n-(wThickness[DOWN]+wThickness[UP]); //往下能走多少格?方阵的行数减去上方和下方墙的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
            /*    row++;*/
                row--;

                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i
                i++;
            }
        /*    wThickness[LEFT]++; //左侧的墙的厚度增加1*/
            wThickness[RIGHT]++; //右侧的墙的厚度增加1
            break;



    case LEFT: //左
            nStep=n-(wThickness[RIGHT]+wThickness[LEFT]); //往左能走多少格?方阵的列数减去右侧和左侧的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
                col--;
                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i;
                i++;
            }
        /*    wThickness[UP]++; //上方的墙的厚度增加1 */
            wThickness[DOWN]++; //上方的墙的厚度增加1
            break;


        
        case UP: //上
            nStep=n-(wThickness[DOWN]+wThickness[UP]);   //往上能走多少格?方阵的行数减去上方和下方墙的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
            /*    row--;*/   
                row++;
                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i;
                i++;               
            }
        /*    wThickness[RIGHT]++; //右侧的墙的厚度增加1*/
            wThickness[DOWN]++; //右侧的墙的厚度增加1
            break;
        
    /*    case LEFT: //左
            nStep=n-(wThickness[RIGHT]+wThickness[LEFT]); //往左能走多少格?方阵的列数减去右侧和左侧的厚度
            printf("direct=%d, nStep=%d\n", direct, nStep);
            for(j=1; j<=nStep; j++) //将数字填写到恰当位置
            {
                col--;
                *(mtrx+row*n+col)=i; //实质要达到的目的是: mtrx[row][col]=i;
                i++;
            }
            wThickness[UP]++; //上方的墙的厚度增加1
            break;
        */
        default: //should not run here
            printf("error in fillA()\n");
            break;            
        }

        direct=(direct+1)%4;
    }
}



int main(void)
{
    {//fixed size,预先固定大小的方阵
    fillA(&gMtrx[0][0],N);
    printMtrx(&gMtrx[0][0],N);
    }

    {//variable size,预先不固定方阵的大小,由用户指定大小
    int n;
    int *mtrx=NULL;
    printf("pls enter a postive integer less than 100:\n");
    fflush(stdin);
    scanf("%d",&n);
    mtrx=(int *)malloc(sizeof(int)*n*n);
    fillA(mtrx,n);
    printMtrx(mtrx,n);
    free(mtrx);
    }

    return 0;
}
搜索更多相关主题的帖子: include 
2014-06-16 22:34
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
收藏
得分:10 
这是要帮你查错误么?

自己找吧 进步大大的

实在解决不了吧再指出不解的地方

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-06-16 23:52
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:10 
与其帮别人找错,我更喜欢自己写,我的程序还没有优化,重复的很多,不过运行没问题!
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int left,right,top,down;
  int i,j;
  int n,num,loop;
  int *matrix;
  printf("Please input the size of the Matrix:");
  scanf("%d",&n);
  matrix=(int *)malloc(sizeof(int)*n*n);
  left=0;
  right=n-1;
  top=0;
  down=n-1;
  num=1;
  while(left<=right&&top<=down)
    {
          for(j=top,loop=0;j<=down&&loop<1;j++,loop++)
        {
          for(i=left;i<=right;i++)
            {
                  matrix[i+j*n]=num;
                  num++;
            }
        }    
          top++;
          
        for(j=right,loop=0;j>=left&&loop<1;j--,loop++)
        {
              for(i=top;i<=down;i++)
            {
                  matrix[i*n+j]=num;
                  num++;
            }
        }
          right--;
  
          for(j=down,loop=0;j>=top&&loop<1;j--,loop++)
        {
              for(i=right;i>=left;i--)
            {
                  matrix[i+j*n]=num;
                  num++;
            }
        }
          down--;
      
          for(j=left,loop=0;j<=right&&loop<1;j++,loop++)
        {
              for(i=down;i>=top;i--)
            {
                  matrix[i*n+j]=num;
                  num++;
            }
        }
          left++;
    }
  for(i=0;i<n;i++)
    {
      for(j=0;j<n;j++)
        printf("%5d",matrix[i*n+j]);
      printf("\n");
    }
    return 0;

}

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2014-06-17 09:32
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:0 
我的程序需要修改的地方很多,尤其for循环,每次都是发帖之后才发现写的很垃圾,现在没时间改,将就着看吧!程序很简单,应该都可以看懂吧!
2014-06-17 09:40
快速回复:求助,有哪位大神可以帮我解决方阵填数问题
数据加载中...
 
   



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

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