两道题,雅礼一题矩阵转置
矩阵转置
描述
输入一个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)