两道题,雅礼一题矩阵转置

矩阵转置

描述

输入一个n行m列的矩阵A,输出它的转置AT

输入

第一行包含两个整数n和m,表示矩阵A的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。

输出

m行,每行n个整数,为矩阵A的转置。相邻两个整数之间用单个空格隔开。

 

原代码:

#include <iostream>

using namespace std;

int a[101][101];

int main()

{

    int m,n;

    cin>>m>>n;

    for(int i=1;i<=m;i++)//输入

        for(int j=1;j<=n;j++)

           cin>>a[i][j];

    for(int j=1;j<=m;j++)//输出倒置

      {

        for(int i=1;i<=n;i++)

           cout<<a[i][j]<<" ";

        cout<<endl;

      }

    return 0;

}

正确代码:

#include <iostream>

using namespace std;

int a[101][101];

int main()

{

    int m,n;

    cin>>m>>n;

    for(int i=1;i<=m;i++)//输入

        for(int j=1;j<=n;j++)

           cin>>a[i][j];

    for(int j=1;j<= n;j++)

      {

        for(int i=1;i<= m;i++)

           cout<<a[i][j]<<" ";

        cout<<endl;

      }

    return 0;

}

 

错误原因:仅当n=m时,程序成立,需把n和m调换过来

24:蛇形填充数组

总时间限制: 

1000ms

 

内存限制: 

65536kB

描述

用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。

蛇形填充方法为:

对于每一条左下-右上的斜线,从左上到右下依次编号1,2,...,2n-1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。

比如n=4时,方阵填充为如下形式:

1  2  6  7

3  5  8  13

4  9  12 14

10 11 15 16

输入

输入一个不大于10的正整数n,表示方阵的行数。

输出

输出该方阵,相邻两个元素之间用单个空格间隔。

#include <iostream>

using namespace std;

int main()

{

    int n,k=1,i=1,j=1;

         cin>>n;

         int a[n+1][n+1];

    while(k<=n*n)

           {

        while(j<=n&&i>=1)

                     {

                       a[i][j]=k;//往右上角走

                            i--;

                            j++;

                            k++;

                     }

                   i++;//换行

        if(j>n)//列锁定

                     {

                       i++;

                            j--;

                     }

        while(j>=1&&i<=n)//往左下角走

                     {

                       a[i][j]=k;

                            i++;

                            j--;

                            k++;

                     }

                   j++;

        if(i>n)//行锁定

                     {

                       i--;

                            j++;

                     }

     }

    for(int i=1;i<=n;i++)

            {

               for(int j=1;j<=n;j++)

                        cout<<a[i][j]<<" ";

                     cout<<endl;

            }

    return 0;

}

思路:当数字走到边缘时进行转弯,while(k*k)

posted @ 2018-03-09 07:46  小蒟蒻i  阅读(1003)  评论(0编辑  收藏  举报