鱼C论坛

 找回密码
 立即注册
查看: 4657|回复: 5

[技术交流] 一道笔试题,看看大家怎么写的,有没有好的算法

[复制链接]
发表于 2013-1-8 14:07:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X 先附上我自己写的,感觉不好,希望同学们可以给出更好的答案,为了不影响大家的思路,先隐藏
游客,如果您要查看本帖隐藏内容请回复



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-8 18:39:45 | 显示全部楼层
看看,有意思
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-9 10:30:14 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-9 14:34:09 | 显示全部楼层
等我先想想!!!1
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-9 16:35:47 | 显示全部楼层
考虑了一下,把我的代码贴出来,大家看看。
  1. #include <stdio.h>

  2. #define N 17

  3. int main(int argc, char *argv[]) {
  4.         char *char_array = "XY0123456789";

  5.         // 需要的字符种类
  6.         const int total_char_type = (N + 1) / 2;

  7.         char char_map[N][N];
  8.         char char_map_lt[total_char_type][total_char_type];

  9. /////////////////////// 方法一 /////////////////////////////////////////
  10.         // 将整幅图划分为四个部分,这是左上部分的数据
  11.         //for (int i = 0; i < total_char_type; ++i) {
  12.         //        for (int j = 0; j < total_char_type; ++j) {
  13.         //                int min = i < j ? i : j;
  14.         //                char_map_lt[i][j] = char_array[min];
  15.         //        }
  16.         //}

  17.         //// 利用对称的性质,对左上部分的数据进行扩展
  18.         //for (int i = 0; i < N; ++i) {
  19.         //        int index_i = i < total_char_type ? i : (N - 1 - i);

  20.         //        for (int j = 0; j < N; ++j) {
  21.         //                int index_j = j < total_char_type ? j : (N - 1 - j);

  22.         //                char_map[i][j] = char_map_lt[index_i][index_j];
  23.         //                //printf("%4c", char_map_lt[index_i][index_j]);
  24.         //        }

  25.         //        //printf("\n");
  26.         //}

  27. ///////////////////// 方法二 /////////////////////////////////////////
  28. // 方法一写完后,整理了一下突然想到的
  29. // 以图最中心点为坐标最高点,沿着上下左右四个方向分别递减
  30. // 以此建立一个新的坐标系,其中x,y的最小值即为字符序号
  31.         for (int i = 0; i < N; ++i) {
  32.                 int coord_i = i < total_char_type ? i : (N - 1 -i);
  33.                 for (int j = 0; j < N; ++j) {
  34.                         int coord_j = j < total_char_type ? j : (N - 1 -j);

  35.                         int coord_min = coord_i < coord_j ? coord_i : coord_j;
  36.                         char_map[i][j] = char_array[coord_min];
  37.                 }
  38.         }

  39.         for (int i = 0; i < N; ++i) {
  40.                 for (int j = 0; j < N; ++j) {
  41.                         printf("%4c", char_map[i][j]);
  42.                 }
  43.                 printf("\n");
  44.         }

  45.         return 0;
  46. }
复制代码
我将时间复杂度降为了O(n^2)。不知其他鱼油还有其他好算法没,希望能互相交流讨论。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-9 16:46:27 | 显示全部楼层
本帖最后由 暮色沧绯 于 2013-1-9 18:24 编辑

写得很烂,不要介意

#include<stdio.h>
#include<string.h>

int main(void)
{
   char a[21][21];
   char b[] = "XY01234567";
   int t, i, j, n;
   
   while(scanf("%d", &n) != EOF)
   {
       for(i = 0; i < 10; i++)
           a[i][i = b[i];
       a[0][0 = a[0][n - 1 = a[n - 1][0 = a[n - 1][n - 1 = 'X';
       t = (n - 1) / 2;
       for(i = 1; i <= t; i++)
           a[n - 1 - i][n - 1 - i = a[n - i - 1][i = a[i][n - 1 - i = a[i][i];
       for(i = 0; i <= t; i++)
           for(j = i + 1; j < n - i - 1; j++)
               a[i][j = a[n - 1 - i][j = a[j][i = a[j][n - 1 - i = a[i][i];
       for(i = 0; i < n; i++)
       {
           for(j = 0; j < n; j++)
               printf("%c", a[i][j]);
           printf("\n");
       }
   }
   return 0;
}

小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-23 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表