多维数组与字符串
矩阵翻转输出
给定一个 m 行、n 列的矩阵,你需要根据要求将它水平翻转或竖直翻转。对于矩阵 A=[453612],如果我们对 AA 进行水平翻转,我们将得到 A' = [123645];如果我们对 AA 进行竖直翻转,我们将得到 A'' =[546321]。
输入格式
测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1001≤m,n≤100),两个整数之间用一个空格分隔。
接下来输入 m 行,每行包含 n 个整数,每两个整数之间用一个空格分隔。
接下来输入一行,输入一个整数为1
或0
。当输入为1
时对矩阵进行水平翻转;当输入为0
时对矩阵进行竖直翻转。
输出格式
输出包括 m 行,每行包含 n 个整数,按要求输出翻转后的矩阵,每行任意两个整数之间用一个空格分隔,每行最后一个整数后面没有空格。
样例输入1
2 3
1 2 3
3 4 6
1
样例输出1
3 2 16 4 3
#include <stdio.h>
int main() {
int a[100][100];
int m,k;
int n,i,j;
scanf("%d %d",&m,&n);
for( i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d",&k);
if(k == 1){
for(i=0; i<m; i++){
for(j=n-1; j>=0; j--){
printf("%d", a[i][j]);
if(j != 0)
printf(" ");
}
printf("\n");
}
}
if(k == 0){
for(i=m-1; i>=0; i--){
for(j=0; j<n; j++){
printf("%d", a[i][j]);
if(j != n-1)
printf(" ");
}
printf("\n");
}
}
return 0;
}
矩阵螺旋输出
给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]
位置开始,具体请参见下图)。
输入格式
测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n( 1001≤m,n≤100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(−10000≤a,b,c≤10000),每两个整数之间用一个空格分隔。
输出格式
输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
样例输入1
2 3
1 2 3
3 4 6
样例输出1
1 2 3 6 4 3
#include <stdio.h>
const int vis = 1000000000;
int nowx = 0, nowy = 0, dir = 0;
int step[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main() {
int matrix[100][100];
int m;
int n;
scanf("%d %d", &m, &n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
for (int i = 0; i < m * n; i++) {
if( i==m*n-1) printf("%d", matrix[nowx][nowy]);
else printf("%d ", matrix[nowx][nowy]);//注意最后一个没有空格
matrix[nowx][nowy] = vis;
int nextx = nowx + step[dir][0];
int nexty = nowy + step[dir][1];
if (nextx < 0 || nextx >= m || nexty < 0 || nexty >= n || matrix[nextx][nexty] == vis) {
dir = (dir + 1) % 4;
nextx = nowx + step[dir][0];
nexty = nowy + step[dir][1];
}
nowx = nextx;
nowy = nexty;
}
return 0;
}
排兵布阵
蒜头将军准备布一个新的方阵队形,来抵御来自四面八方的敌人,如果已知每个士兵的武力值,请你帮他计算一下,在某次排兵布阵的过程中,最外层士兵们的武力值是多少。
输入格式
第一行分别为队伍的行数 m和列数 n(m < 100,n<100),两者之间以一个空格分开。
接下来输入的 m 行数据中,每行包含 n 个整数(取值范围为 [0, 9]),整数之间以一个空格分开,表示每个士兵的武力值。
输出格式
输出最外层士兵们的武力值。
格式说明
输出时每行末尾的多余空格,不影响答案正确性
样例输入
3 3
3 4 1
3 7 1
2 8 1
样例输出
23
#include <stdio.h>
int main() {
int a[100][100];
int m;
int n,i,j;
scanf("%d %d",&m,&n);
for( i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int sum = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || i == m-1 || j == 0 || j == n-1) {
sum += a[i][j];
}
}
}
printf("%d\n", sum);
return 0;
}
中心矩阵
对于给定的整数 n,我们需要输出一个 n × n 的中心矩阵。中心矩阵的定义是最外层边界由 1 组成,然后是第二层边界由 2 组成,依次类推,直到中心部分为 n 组成。
样例输入 5,代码将输出如下中心矩阵:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
#include <stdio.h>
int main() {
int a[100][100];
int n,i,j;
scanf("%d",&n);
int m=(n+1)/2;;
for (int i = 0; i < m; i++) {
for (int j = i; j < n - i; j++) {
a[i][j] = i + 1;
a[j][i] = i + 1;
a[n - i - 1][j] = i + 1;
a[j][n - i - 1] = i + 1;
}
}
for ( i = 0; i < n; i++) {
for ( j = 0; j < n; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
最大子矩阵
给定一个 m×n 的矩阵,1002≤m,n≤100。这个矩阵中包含着很多 2×2 的子矩阵。
那么在这些子矩阵当中,哪一个子矩阵的四个元素乘积最大呢?(数据保证答案唯一)
输入格式
输入为 m + 1行:
- 第一行为两个整数 m 和 n,1002≤m,n≤100,为矩阵的行数和列数;
- 接下来的 m 行中,每行为用空格隔开的 nn 个正整数,每个正整数的值不超过 10000。
输出格式
输出为 3 行:
- 第一行是一个整数,为所有子矩阵四个元素乘积的最大值;
- 接下来的两行,为四个元素乘积最大的 2×2 子矩阵,每行为用空格隔开的两个整数。
格式说明
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
2 22 34 5
样例输出1
1202 34 5
#include <stdio.h>
int main() {
int m;
int n;
scanf("%d %d",&m,&n);
long int a[m][n];//注意内存受限问题
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%ld ",&a[i][j]);
}
}
long long int max = 0;
int row = 0, col = 0;
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < n - 1; j++) {
long long int product = a[i][j] * a[i][j+1] * a[i+1][j] * a[i+1][j+1];
if (product > max) {
max = product;
row = i;
col = j;
}
}
}
printf("%lld\n", max);
printf("%ld %ld\n", a[row][col], a[row][col + 1]);
printf("%ld %ld\n", a[row + 1][col], a[row + 1][col + 1]);
return 0;
}
矩阵蛇形输出
给定一个 m 行、n 列的矩阵,请按照下图所示的顺序输出矩阵中所有的元素(从[0][0]
位置开始,具体请参见下图)。
注意 每次碰到边界后,必须且只能沿着边界移动一格,不能后退,不能超出边界;在非边界区域只能向右上或左下方向前进。
输入格式
测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1≤m,n≤100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(−10000≤ 每个数≤10000),每两个整数之间用一个空格分隔。
输出格式
输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
格式说明
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
2 3 1 2 3 4 5 6
样例输出1
1 2 4 5 3 6
#include <stdio.h>
void print(int a[][1001], int m, int n) {
int row = 0; // 当前行的索引
int col = 0; // 当前列的索引
int dir = 1; // 方向,1表示向上,-1表示向下
for (int i = 0; i < m * n; i++) { // 通过循环控制打印次数,m * n为总的元素个数
if(i==m*n-1) printf("%d", a[row][col]);
else printf("%d ",a[row][col]);//注意输出格式
if (dir == 1) { // 当方向为向上时
if (col == n - 1) { // 如果已经到达最右边一列
row++; // 行加1,改为向下方向
dir = -1;
} else if (row == 0) { // 如果已经到达第一行
col++; // 列加1,改为向下方向
dir = -1;
} else {
row--; // 行减1,继续向上方向
col++; // 列加1
}
} else { // 当方向为向下时
if (row == m - 1) { // 如果已经到达最下面一行
col++; // 列加1,改为向上方向
dir = 1;
} else if (col == 0) { // 如果已经到达第一列
row++; // 行加1,改为向上方向
dir = 1;
} else {
row++; // 行加1,继续向下方向
col--; // 列减1
}
}
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n); // 输入矩阵的行数和列数
int a[1001][1001]; // 定义矩阵数组
// 输入矩阵的元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
print(a, m, n); // 调用打印函数
return 0;
}