KiKi有一个矩阵,他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。
KiKi有一个矩阵,他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。提示:当t为别的字符时不需要处理接下来一行输入k,表示要执行k次操作(1≤k≤5)。接下来有k行,每行包括一个字符t和两个数a和b,中间用空格格分隔,t代表需要执行的操作,当t为字符'r'时代表进行行变换,当t为字符'c'时代表进行列变换,a和b为需要互换的行或列(1≤a≤b≤n≤10,1≤a≤b≤m≤10)。
输出n行m列,为矩阵交换后的结果。每个数后面有一个空格。
2 2 1 2 3 4 1 r 1 2
3 4 1 2
2 2 1 3 6 8 2 c 1 2 t 1 2
3 1 8 6
当t为别的字符时不需要处理,所以只交换了原矩阵的第1列和第2列。
#include <stdio.h>
// 行交换函数:交换矩阵的第a行和第b行
void swapRows(int arr[10][10], int cols, int a, int b) {
int temp;
// 遍历一行中的所有列元素进行交换
for (int j = 0; j < cols; j++) {
temp = arr[a][j];
arr[a][j] = arr[b][j];
arr[b][j] = temp;
}
}
// 列交换函数:交换矩阵的第a列和第b列
void swapCols(int arr[10][10], int rows, int a, int b) {
int temp;
// 遍历一列中的所有行元素进行交换
for (int i = 0; i < rows; i++) {
temp = arr[i][a];
arr[i][a] = arr[i][b];
arr[i][b] = temp;
}
}
int main() {
int arr[10][10] = {0};
int n, m; // n为行数,m为列数
// 读取矩阵的行数和列数
scanf("%d %d", &n, &m);
// 读取矩阵元素
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
int key; // 操作次数
scanf("%d", &key);
getchar(); // 吸收换行符
for (int i = 0; i < key; i++) {
char ch;
int a, b;
scanf("%c %d %d", &ch, &a, &b);
getchar(); // 吸收换行符
a--;
b--;
// 根据操作类型调用对应的函数
if (ch == 'r') {
swapRows(arr, m, a, b); // 传入列数作为参数
} else if (ch == 'c') {
swapCols(arr, n, a, b); // 传入行数作为参数
}
}
// 打印结果矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
int main()
{
int num1 = 0;
int num2 = 0;
int i = 0;
int j = 0;
int n = 0;
int k = 0;
int a = 0;
int b = 0;
char p;
int sums[50][50];
scanf(" %d %d", &num1, &num2);
for (i = 0; i < num1; i++)
{
for (j = 0; j < num2; j++)
{
scanf("%d", &sums[i][j]);
}
}
int t = 0;
scanf(" %d", &k);
for (i = 0; i < k; i++)
{
scanf(" %c %d %d", &p, &a, &b);
a = a - 1; b = b - 1;
if (p == 'r')
{
for (int j1 = 0; j1 < num2; j1++)
{
t = sums[a][j1];
sums[a][j1] = sums[b][j1];
sums[b][j1] = t;
}
}
else if (p == 'c')
{
for (int i2 = 0; i2 < num1; i2++)
{
t = sums[i2][a];
sums[i2][a] = sums[i2][b];
sums[i2][b] = t;
}
}
else
{
continue;
}
}
for (i = 0; i < num1; i++)
{
for (j = 0; j < num2; j++)
{
printf("%d ", sums[i][j]);
}
printf("\n");
}
return 0;
} #include<stdio.h>
void my_scanf(int arr[10][10],int n, int m)
{
int i = 0;
int j = 0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d ",&arr[i][j]);
}
}
}
void Exchange(int arr[10][10],int n,int m,char t,int a, int b)
{
int i = 0;
int j = 0;
int temp = 0;
if(t == 'r')
{
for(j=0;j<m;j++)
{
temp=arr[a][j];
arr[a][j] = arr[b][j];
arr[b][j] = temp;
}
}
if(t =='c')
{
for(i=0;i<n;i++)
{
temp=arr[i][a];
arr[i][a] = arr[i][b];
arr[i][b] = temp;
}
}
}
void Arr_printf(int arr[10][10],int n,int m)
{
int i = 0;
int j = 0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d",&n,&m);
int arr[10][10]={0};
my_scanf(arr,n,m);
char t = 0;
int a = 0;
int b = 0;
int k = 0;
scanf("%d\n",&k);
while(k)
{
scanf("%c %d %d\n",&t,&a,&b);
Exchange(arr,n,m,t,a-1,b-1);
k--;
}
Arr_printf(arr,n,m);
return 0;
} #include <stdio.h>
int main() {
int n = 0, m = 0;
scanf("%d%d", &n, &m);
int arr[10][10] = { 0 };
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
int k = 0;
scanf("%d", &k);
char a;
int b = 0, c = 0;
for(int i = 0; i < k; i++)
{
scanf(" %c%d%d", &a, &b, &c);
while(a == 'c' || a == 'r')
{
if (a == 'r')
{
for (int j = 0; j < m; j++)
{
int tmp = arr[b-1][j];
arr[b-1][j] = arr[c-1][j];
arr[c-1][j] = tmp;
}
}
else if (a == 'c')
{
for (int i = 0; i < n; i++)
{
int tmp = arr[i][b-1];
arr[i][b-1] = arr[i][c-1];
arr[i][c-1] = tmp;
}
}
break;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
} #include<stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int arr[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
int k;
scanf("%d", &k);
for (int num = 0; num < k; num++) {
char c;
int x, y;
scanf(" %c %d %d", &c, &x, &y);// 注意空格,忽略前面的换行符
if (c == 'r') {
for (int i = 0; i < m; i++) {
int tmp = arr[x - 1][i];
arr[x - 1][i] = arr[y - 1][i];
arr[y - 1][i] = tmp;
}
} else if (c == 'c') {
for (int i = 0; i < n; i++) {
int tmp = arr[i][x - 1];
arr[i][x - 1] = arr[i][y - 1];
arr[i][y - 1] = tmp;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
} #include <stdio.h>
int main() {
int a, b;
int arr[10][10]={10};
scanf("%d%d",&a,&b);
for (int i=0; i<a; i++) {
for (int j=0; j<b; j++) {
scanf("%d",&arr[i][j]);
}
}
int m=0;
char c1=0;
int c,d;
scanf("%d", &m);
for (int i=0; i<m; i++) {
scanf(" %c %d %d", &c1, &c, &d);
if (c1=='r') {
for (int j=0;i<b ; i++) {
int tmp=arr[c-1][i];
arr[c-1][i]=arr[d-1][i];
arr[d-1][i]=tmp;
}
}
else if (c1=='c') {
for (int j=0; j<a; j++) {
int tmp=arr[j][c-1];
arr[j][c-1]=arr[j][d-1];
arr[j][d-1]=tmp;
}
}
}
for(int i=0 ;i<a ;i++) {
for(int j=0 ;j<b ;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
} 为啥总是有一些过不去
#include <stdio.h>
#include <malloc.h>
int main()
{
//矩阵的行与列
int n = 0;
int m = 0;
//指向矩阵的指针
int* p = NULL;
//控制循环的变量
int i = 0;
int j = 0;
int z = 0;
//第3次输入的指令
int k = 0;
char t = 0;
int a = 0;
int b = 0;
int tem = 0;
scanf("%d%d", &n, &m);
//开辟空间
p = (int*)malloc(sizeof(int) * n * m);
if (!p)
{
perror("malloc:p");
return 1;
}
//录入矩阵
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", p + (i * m) + j);
}
}
scanf("%d", &k);
for (z = 0; z < k; z++)
{
scanf(" %c%d%d", &t, &a, &b);
a -= 1;
b -= 1;
//换行
if (t == 'r')
{
for (j = 0; j < m; j++)
{
tem = *(p + (a * m) + j);
*(p + (a * m) + j) = *(p + (b * m) + j);
*(p + (b * m) + j) = tem;
}
}
//换列
else if (t == 'c')
{
for (i = 0; i < m; i++)
{
tem = *(p + (i * m) + a);
*(p + (i * m) + a) = *(p + (i * m) + b);
*(p + (i * m) + b) = tem;
}
}
}
//输出结果
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%d ", *(p + (i * m) + j));
}
printf("\n");
}
//释放内存
free(p);
p = NULL;
return 0;
} #include <stdio.h>
int main() {
int n,m;
scanf("%d %d",&n,&m);
int i,j;
int arr[n][m];
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
scanf("%d",&arr[i][j]);
}
int k,temp;
scanf("%d",&k);
int a,b;char t;
for(i=0;i<k;i++)
{
scanf(" %c %d %d",&t,&a,&b);
a--;b--; //出错点
if(t=='r')//行变换
{
for(j=0;j<m;j++)
{
temp=arr[a][j];
arr[a][j]=arr[b][j];
arr[b][j]=temp;
}
}
if(t=='c')//列变换
{
for(j=0;j<n;j++)
{
temp=arr[j][a];
arr[j][a]=arr[j][b];
arr[j][b]=temp;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",arr[i][j]);
printf("\n");
}
return 0;
}答题思路是写出来的,但一直出错,最后和答案对比时发现是下标没有对上,在代码中的出错点上
#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int arr[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
scanf("%d", &arr[i][j]);
}
}
char t;
int p, q;
while(scanf(" %c %d %d", &t, &p, &q) != EOF){
p--;
q--;
if(t == 'r'){
for(int j=0; j<m; j++){
int temp = arr[p][j];
arr[p][j] = arr[q][j];
arr[q][j] = temp;
}
}
if(t == 'c'){
for(int i=0; i<n; i++){
int temp = arr[i][p];
arr[i][p] = arr[i][q];
arr[i][q] = temp;
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
} #include<stdio.h>
int main() {
int m = 0;//列
int n = 0;//行
int arr[10][10] = { 0 };
int cnt = 0;//操作的次数
char op = 0;//代表操作的字符
int a = 0;
int b = 0;
//读取数据
scanf("%d%d", &n, &m);
int i = 0;
int j = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
scanf("%d", &cnt);
for (i = 0; i < cnt; i++) {
//读取操作指令
//注释解释:
//scanf("%d", &a);
//scanf(" %c", &c); // 消耗 %d 后的所有后继空白符,然后读一个 char
scanf(" %c %d %d", &op, &a, &b);
//执行操作
if (op == 'r') {
//交换a和b行
for (j = 0; j < m; j++) {
int tmp = arr[a - 1][j];
arr[a - 1][j] = arr[b - 1][j];
arr[b - 1][j] = tmp;
}
} else if (op == 'c') {
//交换a和b列
for (j = 0; j < n; j++) {
int tmp = arr[j][a - 1];
arr[j][a - 1] = arr[j][b - 1];
arr[j][b - 1] = tmp;
}
}
}
//输出
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
} #include <stdio.h>
int main() {
int m,n,k,a[11][11],ci,q,w;
char h;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d",&ci);
for(int p=0;p<ci;p++){
scanf("\n%c%d%d",&h,&q,&w);
if(h=='r'){
for(int i=0;i<m;i++){
int t=a[w-1][i];
a[w-1][i]=a[q-1][i];
a[q-1][i]=t;
}
}
if(h=='c'){
for(int i=0;i<n;i++){
int t=a[i][w-1];
a[i][w-1]=a[i][q-1];
a[i][q-1]=t;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
} #include<stdio.h>
int main() {
int arr[10][10] = { 0 }, n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &arr[i][j]);
int i,k,a,b;
char t = 0;
scanf("%d", &k);
do {
getchar();
scanf("%c %d %d", &t, &a, &b);
int tmp = 0;
a -= 1, b -= 1;
if (t == 'r') {
//行变换
for (int j = 0; j < m; j++)
{
tmp = arr[a][j];
arr[a][j] = arr[b][j];
arr[b][j] = tmp;
}
} else if (t == 'c')
{
//列变换
for (int i = 0; i < n; i++)
{
tmp = arr[i][a];
arr[i][a] = arr[i][b];
arr[i][b] = tmp;
}
}
} while (--k);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
} #include <stdio.h>
int main()
{
int n,m,a,b,k;
char t = '0';
int arr[1000][1000];
int num = 0;
//思路当k满足条件也就是次数时,进行判断r是要行跟行换还是列跟列换,a和b代表要互换的行列
scanf("%d %d",&n,&m);
//取值
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
scanf("%d",&arr[i][j]);
}
}
//判断要循环几次
scanf("%d",&k);
while(k--)
{
//判断是否要进行交换
getchar(); // 清除换行符
scanf("%c %d %d",&t,&a,&b);
if(t == 'r')
{
for(int i = 0;i<m;i++)
{
num = arr[a-1][i];
arr[a-1][i]=arr[b-1][i];
arr[b-1][i]=num;
}
}
else if(t == 'c')
{
for(int i = 0;i<n;i++)
{
num = arr[i][a-1];
arr[i][a-1]=arr[i][b-1];
arr[i][b-1]=num;
}
}
}
//打印
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
} #include <stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int arr[n][m];
int i;
for(i=0;i<n;i++)
{
int j;
for(j=0;j<m;j++)
{
scanf("%d ",arr[i]+j);
}
}
int k,a,b;
char t;
scanf("%d ",&k);
while(k--)
{
scanf("%c %d %d",&t,&a,&b);
getchar();//输入字符的时候注意,要先把/0吸走
a--;
b--;
if(t == 'r')
{
int j;
int tmp;
for(j=0;j<m;j++)
{
tmp = arr[a][j];
arr[a][j] = arr[b][j];
arr[b][j] = tmp;
}
}
else if(t == 'c')
{
int j;
int tmp;
for(j=0;j<n;j++)
{
tmp = arr[j][a];
arr[j][a] = arr[j][b];
arr[j][b] = tmp;
}
}
}
for(i=0;i<n;i++)
{
int j;
for(j=0;j<m;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
} #include <stdio.h>
void swap(int* x,int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int n = 0,m = 0,a = 0,b = 0;
int arr[12][12] = {0};
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
scanf("%d",&arr[i][j]);
}
}
int k = 0;
char op[2] = "0";
scanf("%d",&k);
//getchar();
while(k--)
{
scanf("%s %d %d",op,&a,&b);//%s不取空白字符
//getchar();
if(op[0]=='r')
{
for(int k = 1;k<=m;k++)
{
swap(&arr[a][k],&arr[b][k]);
}
}
else if(op[0]=='c')
{
for(int k = 1;k<=n;k++)
{
swap(&arr[k][a],&arr[k][b]);
}
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
printf("%d ",arr[i][j]);
}
puts("");
}
return 0;
}