LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1178|回复: 13

发一个简章的编程题,看谁写的最好。

[复制链接]
发表于 2006-12-27 18:37:25 | 显示全部楼层 |阅读模式
要求:用类C写,如C、C++、JAVA等
题目:数组A[N*N]和数组B[N][N],把A中的数据以折线方式放在B中
举个简单点的情形,比如A中存的是0~n*n-1
则B如下:
{0 2 3 9 10 ........}
{1 4 8  11 ..........}
{5 7  12 .............}
{6  13 ................}
{14 ....................}
{15 ....................}
{.........................}
 楼主| 发表于 2006-12-27 18:38:14 | 显示全部楼层
不要以为很简单哦,动手写写试试。
回复 支持 反对

使用道具 举报

发表于 2006-12-27 22:13:41 | 显示全部楼层
最简单的办法,逐个填进去。没仔细验证,不知道对不对。
数值 n 可以容易地映射为 A数组的行列值,如:
col=n%COL; row=n/ROW;
然后把下面程序中的 B[x][x]=xxx 改为 B[x][x]=A[row][col] 就可以了。
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int main()
  5. {
  6.     const int ROW=13;
  7.     const int COL=9;
  8.     int B[ROW][COL];
  9.     int max=ROW*COL-1;
  10.     int n,i,j;
  11.     n=i=j=0;
  12.     B[i][j]=0;
  13.     for(;n<max;){
  14.         while(j>0 && i<ROW-1 && n<max )
  15.             B[++i][--j]=++n;
  16.         if( n<max ){
  17.             if( i<ROW-1) B[++i][j]=++n;
  18.             else B[i][++j]=++n;
  19.         }
  20.         while(i>0 && j<COL-1 && n<max)
  21.             B[--i][++j]=++n;
  22.         if(n<max){
  23.             if(j<COL-1) B[i][++j]=++n;
  24.             else B[++i][j]=++n;
  25.         }
  26.     }
  27.     // print the results int B[][]   
  28.     for(i=0; i<ROW; ++i){
  29.         for(j=0; j<COL; ++j)
  30.             cout<<setw(4)<<B[i][j];
  31.         cout<<endl;
  32.     }
  33. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-28 01:44:17 | 显示全部楼层
凑热闹

  1. #define ROW 13
  2. #define COL 9
  3. void f(int a[ROW][COL],int n,int col)
  4. {
  5.         int l,c,_ch_c,_ch_l;
  6.         a[0][0] =_ch_c =0;
  7.         for(c =1;c <col;c++)
  8.         {
  9.                 a[0][c] =a[0][c-1] +(_ch_c ? 1 :(c < n ?c+c:n+n-1));
  10.                 _ch_c =!_ch_c;       
  11.         }
  12.         _ch_c =_ch_l =0;
  13.         for(l =1;l <n;l++)
  14.         {
  15.                 for(c=0;c<col;c++)
  16.                 {
  17.                         a[l][c] =(c !=col-1)?
  18.                                 a[l-1][c+1] +(_ch_c ? 1 : -1):
  19.                                 a[l-1][c] +(_ch_c ? 1 :
  20.                                 (n-l >= col ? col+col-1:n-l+n-l));
  21.                         _ch_c =!_ch_c;       
  22.                 }
  23.                 _ch_l =!_ch_l;
  24.                 _ch_c =_ch_l;       
  25.         }
  26. }
  27. int main(int argc,char ** argv)
  28. {
  29.         int a[ROW][COL],i,j;

  30.         f(a,ROW,COL);

  31.         for(i =0; i< ROW;i++)
  32.         {
  33.                 for(j =0; j< COL;j++)
  34.                 {
  35.                         printf("%4d ",a[i][j]);
  36.                 }
  37.                 printf("\n");
  38.         }
  39.         return 1;
  40. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-28 09:54:02 | 显示全部楼层

我也来

经过验证的,先说明一下,我是做硬件的,有错误还请先恕之再指教。

  1. #include<iostream>
  2. #include <stdio.h>
  3. #define N 10
  4. using namespace std;

  5. int main(void)
  6. {
  7.     int A[N][N],B[N][N];
  8.     bool updown = true; //折线的初始方向 true:up false:down
  9.     bool edge = true; //转折点
  10.     unsigned int  rb = 0, cb = 0;
  11.     for (unsigned int ra = 0; ra < N; ra++) //给A[N][N]赋值
  12.     {
  13.         for (unsigned int ca = 0; ca < N; ca++)
  14.         {
  15.             A[ra][ca] = ra * N + ca;
  16.         }        
  17.     }
  18.     for (unsigned int ra = 0; ra < N; ra++) //给B[N][N]赋值
  19.     {
  20.         for (unsigned int ca = 0; ca < N; ca++)
  21.         {
  22.             B[rb][cb] = A[ra][ca];
  23.             if (edge)
  24.             {//处理转折
  25.                  if (rb == N-1)
  26.                  {
  27.                     cb++;
  28.                     edge = false;
  29.                     continue;   
  30.                  }
  31.                  else if (cb == N-1)
  32.                  {
  33.                     rb++;
  34.                     edge = false;
  35.                     continue;   
  36.                  }                  
  37.                  else if (cb == 0)//判断cb,rb先后决定初始折转的方向
  38.                  {
  39.                     rb++;
  40.                     edge = false;
  41.                     continue;   
  42.                  }
  43.                  else if (rb == 0)
  44.                  {
  45.                     cb++;
  46.                     edge = false;
  47.                     continue;   
  48.                  }
  49.                  else
  50.                       {
  51.                                 cout << "error" << endl;
  52.                                 cout << rb << " " << cb << endl;
  53.                       }      
  54.             }            
  55.             if (updown)
  56.             {
  57.                  rb--;
  58.                  cb++;
  59.             }
  60.             else
  61.             {
  62.                 rb++;
  63.                 cb--;
  64.             }
  65.             if (((rb == 0) || (rb >= N-1) || (cb == 0) || (cb >= N-1)) && (edge == false))
  66.             {//边界检查
  67.                updown = !updown;
  68.                edge = true;
  69.             }
  70.         }        
  71.     }
  72.     cout << "A[" << N-1 << "][" << N-1 << "] =" <<endl;
  73.     for (unsigned int ra = 0; ra < N; ra++)
  74.     {
  75.         for (unsigned int ca = 0; ca < N; ca++)
  76.         {
  77.             cout << A[ra][ca] << "  ";
  78.         }
  79.         cout << endl;        
  80.     }
  81.     cout << "B[" << N-1 << "][" << N-1 << "] =" <<endl;
  82.     for (unsigned int rb = 0; rb < N; rb++)
  83.     {
  84.         for (unsigned int cb = 0; cb < N; cb++)
  85.         {
  86.             cout << B[rb][cb] << "  ";
  87.         }
  88.         cout << endl;        
  89.     }
  90.     system("pause");
  91.     return 0;  
  92. }

复制代码

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 18:59:49 | 显示全部楼层
再努力写下更简练的。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 19:02:15 | 显示全部楼层
注意一下,是方阵哦,最上面的两位怎么写的是Row=13 Col=9啊?不过不影响算法的正确性。方阵有没有更简单的方法呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 19:10:41 | 显示全部楼层
linux__________________兄,main函数return 1代表出错吧。
3楼4楼写的很精练,5楼写的可读性高呵呵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 19:13:01 | 显示全部楼层
不过,好像上面的读题有点问题,我写的是A[N*N]是一维数组。。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 22:15:15 | 显示全部楼层
好了,还是贴出来标程吧。

  1. #include<iostream>
  2. #include<iomanip>
  3. #define N 10
  4. using namespace std;
  5. int main()
  6. {
  7.    int A[N*N];
  8.    int B[N][N];
  9.    int n=0;
  10.    for(int i=0;i<N*N;i++) { // set A[N*N]
  11.        A[i]=i;
  12.    }
  13.    for(int i=0;i<N;i++)   
  14.       for(int j=i;j>=0;j--)   { //fill B with A
  15.         B[(i%2==0)?j:(i-j)][(i%2!=0)?j:(i-j)]=A[n];
  16.         B[(i%2==0)?(N-1-j):(N-1-i+j)][(i%2!=0)?(N-1-j):(N-1-i+j)]=A[N*N-1-n];
  17.         n++;
  18.       }
  19.    for(int i=0;i<N;i++)   {  //print B
  20.      for(int j=0;j<N;j++)   {
  21.          cout<<setw(4)<<" "<<B[i][j];
  22.      }   
  23.      cout<<endl<<endl;
  24.    }
  25.    return 0;   
  26. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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