多维数组
1. 矩阵转置
输入一个数字构成的矩形, 将矩形的值进行转置后打印
输入:
第一行 正整数n(1<n<10), 表示矩阵的边长
随后输入一个矩阵
输出:
转置后的矩阵
样例输入:
3
1 2 3
4 5 6
7 8 9
样例输出:
1 4 7
2 5 8
3 6 9
2. 颈椎病治疗
最近云海学长一直对着电脑改bug, 颈椎不舒服, 希望各位小伙伴帮云海学长治治
提供一张图片, 将图片旋转后再发给云海学长, 这样学长看图的时候就需要歪着脖子, 时间久了, 颈椎病就治好了
输入一个数字构成的矩形, 将矩形的值进行90度旋转后打印
输入:
第一行 正整数n(1<n<10), 表示矩阵的边长
随后输入一个矩阵
输出:
90度旋转后的矩阵
样例输入:
3
1 2 3
4 5 6
7 8 9
样例输出:
7 4 1
8 5 2
9 6 3
3. 杨辉三角
输入n(1<n<10), 打印高度为n的杨辉三角
样例输入: 5
样例输出:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
*4. 包围圈
东东哥在一场军事演练中, 需要对一片正方形森林进行排查,
为了防止被包围, 东东哥需要先排查外围才能进一步深入
输入: 正整数n(1<n<10), 表示森林的边长
输出: 东东哥排查森林的顺序
样例输入:
4
样例输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解答
1.矩阵转置
#include<iostream>
usingnamespacestd;
constintN=10;
//按数字顺序生成二维数组
voidFuZhi(intn,inta[][10])
{
intk=0;
for (inti=0; i<n; i++)
{
for (intj=0; j<n; j++)
{
k++;
a[i][j] =k;
}
}
}
//转置,行和列互换
voidZhuanZ(intn,inta[][N])
{
for (inti=0; i<n; i++)
{
for (intj=0; j<n; j++)
{
if (i>j)
{
intt=a[i][j];
a[i][j] =a[j][i];
a[j][i] =t;
}
}
}
}
//打印
voidPrint(intn,inta[][10])
{
for (inti=0; i<n; i++)
{
for (intj=0; j<n; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
}
intmain()
{
intn; cin>>n;
if (n>1&&n<=N)
{
inta[N][N];
FuZhi(n, a);
Print(n, a);
cout<<"转置后:"<<endl;
ZhuanZ(n, a);
Print(n, a);
}
system("pause"); return0;
}
// 矩阵转置
voidDemo61() {
//--变量声明--
// 矩阵边长, 矩阵本身, 转置后数组
intsize, arr[10][10], result[10][10];
//--接收输入--
scanf_s("%d", &size);
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
scanf_s("%d", &arr[i][j]);
}
}
//--数据处理--
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
result[j][i] =arr[i][j];
}
}
//--输出--
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
}
✨2.矩阵90°转置
// 颈椎病
voidDemo62() {
//--变量声明--
// 矩阵边长, 矩阵本身, 转置后数组
intsize, arr[10][10], result[10][10];
//--接收输入--
scanf_s("%d", &size);
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
scanf_s("%d", &arr[i][j]);
}
}
//--数据处理--
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
result[j][size-i-1] =arr[i][j];
}
}
//--输出--
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
}
详细分析:
//数组下标变化:
假设size为3
012
0123
1456
2789
->
012
0741
1852
2963
x1y y x2
[0][0]->[0][2]
[0][1]->[1][2]
[1][2]->[2][1]
[2][1]->[1][0]
//规律:
x转y,y转x
x转y时size-x=y,由于下标开始值为0,所以size-1-x=y
y转x时y=x
如上,y下标原封替换x坐标,但是x下标需要被size-1减后才能作为新数组的y下标。
3.杨辉三角
#include<iostream>
usingnamespacestd;
voidPrint(intn, inta[][10]);
voidYH(intn)
{
inta[10][10];
//计算杨辉三角, 以下三角矩阵的形式存放在二维数组
for (inti=0; i<n; i++) {
a[i][0] =1;
a[i][i] =1;
for (intj=1; j<i; j++)
a[i][j] =a[i-1][j-1] +a[i-1][j]; //i不可能取值为0导致地址越界
}
Print(n,a);
}
voidPrint(intn,inta[][10])
{
for (inti=0; i<n; i++) {
for (intj=1; j<=n-1-i; j++) //打印每行开始的空格
cout<<" ";
for (intj=0; j<=i; j++) //每行打印的数据个数
cout<<a[i][j] <<" ";
cout<<endl;
}
}
intmain() {
intn; cin>>n;
YH(n);
system("pause"); return0;
}
// 杨辉三角
voidDemo63() {
//--变量声明--
// 杨辉三角的高度
intn;
// 存储用数组, 注意杨辉三角只会占用一半的空间, 所以这里可以用malloc动态分配来避免空间浪费
intarr[10][10];
//--接收输入--
scanf_s("%d", &n);
arr[0][0] =1;
//--数据处理--
// 左右两侧数据直接填充即可
for (inti=1; i<n; i++) {
arr[i][0] =arr[i][i] =1;
for (intj=1; j<i; j++) {
arr[i][j] =arr[i-1][j-1] +arr[i-1][j];
}
}
//--输出--
for (inti=0; i<n; i++) {
for (intj=0; j<=i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
✨4.包围圈
// 包围圈
voidDemo64() {
//--变量声明--
intsize, tree[10][10];
// 当前坐标xy, 移动方向toward 0左 1下 2右 3上, 填充数
// 注意 由于第一次探查前会先移动 x++ 所以x需要修正为-1
intx=-1, y=0, toward=0, num=0;
// 一个方向的移动步数
ints;
//--接收输入--
scanf_s("%d", &size);
s=size;
//--数据处理--
// 移动规律 如果是4 则是4+3+3+2+2+1+1 = 16 同理 如果是5 5+4+4+3+3+2+2+1+1
// 外部循环: 每奇数次循环, 最大步数-1. 一个方向移动完后 对方向进行修改
// 内部循环: 循环(步数)次, 每次移动根据方向对xy进行修改
for (inti=0; num<size*size; i++) {
// 奇数次循环 最大步数-1
if (i%2==1) s--;
for (intj=0; j<s; j++) {
// 获取方向并移动
switch (toward) {
case0:
x++;
break;
case1:
y++;
break;
case2:
x--;
break;
case3:
y--;
break;
}
tree[y][x] =++num;
}
// 改变方向 注意 当toward为3 也就是向上时, 需要取模操作 也就是变为0
// (1+1) %4 = 2 (3+1) %4=0
toward= (toward+1) %4;
}
//--输出--
for (inti=0; i<size; i++) {
for (intj=0; j<size; j++) {
printf("%d ", tree[i][j]);
}
printf("\n");
}
}