描述
通过本课程的学习,我们对矩阵越来越熟悉。
给定一个m×nm×n的矩阵,拷贝矩阵最外围一层元素,将原矩阵扩展为一个新的矩阵,如下图所示。扩展后的矩阵大小为(m+2)×(n+2)(m+2)×(n+2)。
输入
每次输入有m+1m+1行。
第一行为两个整数mm (3≤m+2≤30)(3≤m+2≤30) ,nn (3≤n+2≤30)(3≤n+2≤30) ,分别代表矩阵的行和列。
之后的 mm 行,每行有nn 个由空格隔开的整数,每个整数的取值范围为 [-10000, 10000]。
输出
每次输出有m+2m+2行,n+2n+2 列整数。
输入样例 1
3 4 1 2 3 4 5 6 7 8 9 10 11 12
输出样例 1
1 1 2 3 4 4 1 1 2 3 4 4 5 5 6 7 8 8 9 9 10 11 12 12 9 9 10 11 12 12
提示
输出的每一行末尾没有空格。
这个题的解题思路也很明确了,我们可以一步步按着图示来写出我们的代码。先定义出一个二维数组,然后拓展出外面的一边。最后再把四个角补上就好了。
#include <iostream>
using namespace std;
int main()
{
int m, n;
while (cin >> m >> n)
{
int rect[m][n];
for (int ix = 0; ix < m; ix++)
for (int jx = 0; jx < n; jx++)
cin >> rect[ix][jx]; //原矩阵
int s = m + 2, q = n + 2;
int New_rect[s][q];
New_rect[0][0] = rect[0][0];
New_rect[0][q - 1] = rect[0][n - 1];
New_rect[s - 1][0] = rect[m - 1][0];
New_rect[s - 1][q - 1] = rect[m - 1][n - 1]; //对四个角进行赋值
for (int jx = 1; jx < q - 1; jx++)
{
New_rect[0][jx] = rect[0][jx - 1];
New_rect[s - 1][jx] = rect[m - 1][jx - 1];
}
for (int ix = 1; ix < s - 1; ix++)
{
New_rect[ix][0] = rect[ix - 1][0];
New_rect[ix][q - 1] = rect[ix - 1][n - 1];
}
for (int ix = 1; ix < s - 1; ix++)
for (int jx = 1; jx < q - 1; jx++)
{
New_rect[ix][jx] = rect[ix - 1][jx - 1];
}
//分别对四条边进行赋值
for (int ix = 0; ix < s; ix++)
for (int jx = 0; jx < q; jx++)
{
cout << New_rect[ix][jx];
(jx == q-1)?cout << endl:cout << " ";
}
}//输出最终的矩阵,最后一位数字后面没有空格,所以这里运用了三目运算符来满足这一要求
}
这个题也比较简单,报错的原因应该就是while(cin)这个东西了。