免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6007 | 回复: 17
打印 上一主题 下一主题

一道安捷伦笔试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-21 20:38 |只看该作者 |倒序浏览
用C编写程序并注释
N*N矩阵输出
N=3时输出
1 2 3
  8 9 4
  7 6 5
N=4时输出
   1  2  3   4
   12 13 14  5
   11 16 15  6
   10  9  8  7

编写当N时的输出

求职 : 数据库管理员
论坛徽章:
0
2 [报告]
发表于 2006-11-21 22:35 |只看该作者
写出来了吗?

论坛徽章:
0
3 [报告]
发表于 2006-11-21 22:47 |只看该作者
阿,强。。。。。。等我来想想

论坛徽章:
0
4 [报告]
发表于 2006-11-21 23:40 |只看该作者
very easy 好像以前讨论过

论坛徽章:
0
5 [报告]
发表于 2006-11-22 01:54 |只看该作者

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. enum {
  5.         MASK_UP                = 1,
  6.         MASK_DOWN        = 2,
  7.         MASK_LEFT        = 4,
  8.         MASK_RIGHT        = 8,
  9.        
  10.         TURN_NONE        = 0,
  11.         TURN_UP                = 1,
  12.         TURN_DOWN        = 2,
  13.         TURN_LEFT        = 3,
  14.         TURN_RIGHT        = 4,
  15. };

  16. int directs[5][2] = {
  17.         {0, 0},                // 0:TURN_NONE
  18.         {-1, 0},        // 1:TURN_UP
  19.         {1, 0},                // 2:TURN_DOWN
  20.         {0, -1},        // 3:TURN_LEFT
  21.         {0, 1},                // 4:TURN_RIGHT
  22. };

  23. int rules[16] = {
  24.         TURN_NONE,        // 0:none
  25.         TURN_UP,        // 1:up
  26.         TURN_DOWN,        // 2:down
  27.         TURN_NONE,        // 3:invalid
  28.         TURN_LEFT,        // 4:left
  29.         TURN_LEFT,        // 5:left and up
  30.         TURN_DOWN,        // 6:left and down
  31.         TURN_NONE,        // 7:invalid
  32.         TURN_RIGHT,        // 8:right
  33.         TURN_UP,        // 9:right and up
  34.         TURN_RIGHT,        // 10:right and down
  35.         TURN_NONE,        // 11-15:invalid
  36. };
  37. int next_pos(int *matrix, int n, int i, int j, int *nexti, int *nextj)
  38. {
  39.         if (i == -1 || j == -1)
  40.         {
  41.                 *nexti = 0;
  42.                 *nextj = 0;
  43.                 return 1;
  44.         }
  45.         int mask = 0;
  46.         if (i - 1 >= 0 && matrix[(i - 1) * n + j] == 0)                // up ok
  47.                 mask |= MASK_UP;
  48.         if (i + 1 <= n - 1 && matrix[(i + 1) * n + j] == 0)        // down ok
  49.                 mask |= MASK_DOWN;
  50.         if (j - 1 >= 0 && matrix[i * n + (j - 1)] == 0)                // left ok
  51.                 mask |= MASK_LEFT;
  52.         if (j + 1 <= n - 1 && matrix[i * n + (j + 1)] == 0)        // right ok
  53.                 mask |= MASK_RIGHT;
  54.        
  55.         int rule = rules[mask];
  56.         int *direct = directs[rule];
  57.         if (direct[0] == 0 && direct[1] == 0)
  58.                 return 0;
  59.         *nexti = i + direct[0];
  60.         *nextj = j + direct[1];
  61.         return 1;
  62. }

  63. int main(int argc, char *argv[])
  64. {
  65.         if (argc != 2)
  66.                 return -1;
  67.         int n = atoi(argv[1]);
  68.         if (n <= 0)
  69.                 return -1;
  70.        
  71.         int *matrix = (int*)malloc(n * n * sizeof(int));
  72.         memset(matrix, 0, n * n * sizeof(int));

  73.         int i = -1;
  74.         int j = -1;
  75.         int value = 1;
  76.         while (next_pos(matrix, n, i, j, &i, &j) != 0)
  77.         {
  78.                 matrix[i * n + j] = value++;
  79.         }

  80.         for (i = 0; i < n; i++)
  81.         {
  82.                 for (j = 0; j < n; j++)
  83.                 {
  84.                         printf("%d", matrix[i * n + j]);
  85.                         if (j != n - 1)
  86.                                 printf("\t");
  87.                 }
  88.                 printf("\n");
  89.         }
  90.        
  91.         free(matrix);
  92.         return 0;
  93. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-11-22 08:58 |只看该作者
数组类的经典题目

论坛徽章:
0
7 [报告]
发表于 2006-11-22 11:15 |只看该作者

  1. #include <stdio.h>

  2. //get a matrix of n*n
  3. int* get_ma(int n)
  4. {
  5.         int *a=new int[n*n];

  6.         int nr=0;
  7.         int x=0;
  8.         int y=0;
  9.         int dx=1;
  10.         int dy=0;
  11.         //boundaries
  12.         int u=0;
  13.         int d=n-1;
  14.         int l=0;
  15.         int r=n-1;

  16.         int nn=n*n;
  17.         while (nr<nn) {
  18.                 a[x+n*y]=nr;
  19.                 if (dx>0 && x==r) {
  20.                         dx=0;
  21.                         dy=1;
  22.                         ++u;
  23.                 } else if (dx<0 && x==l) {
  24.                         dx=0;
  25.                         dy=-1;
  26.                         --d;
  27.                 }
  28.                 if (dy>0 && y==d) {
  29.                         dx=-1;
  30.                         dy=0;
  31.                         --r;
  32.                 } else if (dy<0 && y==u) {
  33.                         dx=1;
  34.                         dy=0;
  35.                         ++l;
  36.                 }
  37.                 x+=dx;
  38.                 y+=dy;
  39.                 ++nr;
  40.         }

  41.         return a;
  42. }

  43. int main(int argc, char* argv[])
  44. {
  45.         const int n=4;       
  46.         int *a=get_ma(n);
  47.         for (int i=0;i<n*n;++i) {
  48.                 printf("%d\t",a[i]);
  49.                 if ((i+1)%n==0) {
  50.                         putchar('\n');
  51.                 }
  52.         }
  53.         delete a;
  54.         return 0;
  55. }
复制代码

[ 本帖最后由 jronald 于 2006-11-23 14:14 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-11-22 12:37 |只看该作者
#include <stdio.h>
#include <math.h>
#define NUM 5
int main(){

    int a[10][10];
    int n;
    int i,j;
    int number,number_flag,flag;
    int begin,end;
    n=NUM;
    number=1;
    number_flag=n*n;
    i=0;j=0;
    flag=0;
    begin=0;end=n-1;
    while(number_flag!=0){
        if(flag==0){
            if(j==end){
                a[i][j] = number;
                number++;
                i++;
                flag=1;
                number_flag--;
                continue;
            }else{
                a[i][j] = number;
                number++;
                j++;
            }
        }

         if(flag==1){
            if(i==end){
                a[i][j] = number;
                number++;
                j--;
                flag=2;
                number_flag--;
                continue;
            }else{
                a[i][j] = number;
                number++;
                i++;
            }
        }
        if(flag==2){
            if(j==begin){
                a[i][j] = number;
                number++;
                i--;
                flag=3;
                number_flag--;
                continue;
            }else{
                a[i][j] = number;
                number++;
                j--;
            }
        }

        if(flag==3){
            if(i==begin+1){

                a[i][j] = number;
                number++;
                j++;
                flag=0;

                end--;
                begin++;
                number_flag--;
                continue;

            }else{
                a[i][j] = number;
                number++;
                i--;
            }
        }
        number_flag--;

    }
    n=NUM;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

论坛徽章:
0
9 [报告]
发表于 2006-11-22 14:06 |只看该作者
谢谢大家!

论坛徽章:
0
10 [报告]
发表于 2006-11-22 17:18 |只看该作者
不用那么复杂。观察一下规律就可以发现(假定N=5,其它值一样分析法):
赋值转弯的次数分别为"4, 4, 4, 3, 3, 2, 2, 1, 1",如果N = 10, 则为"9, 9, 9, 8, 8, .....3, 2, 2, 1, 1"

程序如下,由于个人感觉本题重在考思路,因此直接使用数组,没有用二维指针动态分配,也只进行了一些基本的错误检查。
#include "test.h"
extern int errno;

typedef struct
{
        int line;
        int row;
}TURN;
#define MAX 10

int main(int argc, char *argv[])
{
        int line = 0, row = 0, flg = 0, pp_num[MAX][MAX];
        int turn_count, N;
        int i, j, k;
        TURN turn[4] =
        {
                {0, 1},
                {1, 0},
                {0, -1},
                {-1, 0}
        };

        //N由参数输入,范围1 - 10
        if ((2 != argc) || ((N = atoi(argv[1])) < 1) || (atoi(argv[1]) > 10))
        {
                printf("Usage : %s (1 - 10)\n", argv[0]);
                return (1);
        }

        //给二维数组赋值
        for (i = 1, turn_count = N - 1, j = 0, k = -1; i <= N * N; i++)
        {
                pp_num[line][row] = i;
                line += turn[flg].line;
                row += turn[flg].row;

                //累积到turn_count次就"转弯"
                if (++j == turn_count)
                {
                        flg = (flg + 1) % 4;
                        ++k;
                        j = 0;
                }
                //每转弯两次,就减少turn_count。第一次要转弯三次才减少turn_count,所以k初始值为-1
                if (2 == k)
                {
                        k = 0;
                        --turn_count;
                }

        }

        for (i = 0; i < N; i++)
        {
                for (j = 0; j < N; j++)
                {
                        printf("%3d  ", pp_num[i][j]);
                }
                printf("\n");
        }

        printf("\n");
        return (0);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP