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> 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 = 0, k = 0, a = 0, b = 0; char input = 0; scanf("%d", &k); do { getchar(); scanf("%c %d %d", &input, &a, &b); int tmp = 0; a -= 1, b -= 1; if (input == 'r') { //行变换 for (int j = 0; j < m; j++) { tmp = arr[a][j]; arr[a][j] = arr[b][j]; arr[b][j] = tmp; } } else if (input == 'c') { //列变换 for (int j = 0; j < n; j++) { tmp = arr[j][a]; arr[j][a] = arr[j][b]; arr[j][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> #define ROW 10 #define COL 10 void translation_row(int arr[ROW][COL], int row1, int row2, int col){ for(int j = 0; j < col; j++){ arr[row1][j] = arr[row1][j] ^ arr[row2][j]; arr[row2][j] = arr[row1][j] ^ arr[row2][j]; arr[row1][j] = arr[row1][j] ^ arr[row2][j]; } } void translation_col(int arr[ROW][COL], int col1, int col2, int row){ for(int i = 0; i < row; i++){ arr[i][col1] = arr[i][col1] ^ arr[i][col2]; arr[i][col2] = arr[i][col1] ^ arr[i][col2]; arr[i][col1] = arr[i][col1] ^ arr[i][col2]; } } int main(){ int n, m, arr[ROW][COL], i, j = 0; int count, num1, num2; // 操作次数 操作数1(行or列) 操作数2(行or列) char option; scanf("%d %d", &n, &m); for(i = 0; i < n * m; i++, j++) scanf("%d", &arr[i / m][j % m]); scanf("%d", &count); while(count > 0){ getchar(); scanf("%c %d %d", &option, &num1, &num2); switch(option){ case 'r': translation_row(arr, num1-1, num2-1, m); //行变换 break; case 'c': translation_col(arr, num1-1, num2-1, n); //列变换 break; default: break; } count--; } for(i = 0; i < n * m; i++, j++){ printf("%d ", arr[i / m][j % m]); if((j + 1) % m == 0) printf("\n"); } return 0; }
#include<stdio.h> int main(void) { int n, m, k; char t[5]; int a[5] = {0}; int b[5] = {0}; scanf("%d %d", &n, &m);//输入矩阵的n行m列 getchar(); int matrix[10][10];//定义一个空的二维矩阵,用于存放输入数据 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &matrix[i][j]);//输入n行m列数据到矩阵中 } getchar(); } scanf("%d", &k);//执行k次操作 getchar(); for (int i = 0; i < k; i++) { scanf("%c %d %d", &t[i], &a[i], &b[i]); getchar(); //printf("%c %d %d\n", t[i], a[i], b[i]); int tem = 0; if ( t[i] == 'r') { //printf("r\n"); for (int x = 0; x < m; x++) { /*tem = matrix[b[i]][x]; matrix[b[i]][x] = matrix[a[i]][x]; matrix[a[i]][x] = tem; */ matrix[a[i]-1][x] ^= matrix[b[i]-1][x]; matrix[b[i]-1][x] ^= matrix[a[i]-1][x]; matrix[a[i]-1][x] ^= matrix[b[i]-1][x]; } } if ( t[i] == 'c') { //printf("c\n"); for (int y = 0; y < n; y++) { tem = matrix[y][b[i]-1]; matrix[y][b[i]-1] = matrix[y][a[i]-1]; matrix[y][a[i]-1] = tem; /* matrix[y][a[i]] ^= matrix[y][b[i]]; matrix[y][b[i]] ^= matrix[y][a[i]]; matrix[y][a[i]] ^= matrix[y][b[i]]; */ } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } return 0; }
#include<stdio.h> int main(){ int n,m,a[10][10],k,p,q,i,j,s; char t; scanf("%d %d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&a[i][j]); scanf("%d",&k); for(s=0;s<k;s++){ scanf(" %c %d %d",&t,&p,&q); if(t=='r') for(j=0;j<m;j++){ a[p-1][j] += a[q-1][j]; a[q-1][j] = a[p-1][j]-a[q-1][j]; a[p-1][j] -= a[q-1][j]; } if(t=='c') for(i=0;i<n;i++){ a[i][p-1] += a[i][q-1]; a[i][q-1] = a[i][p-1]-a[i][q-1]; a[i][p-1] -= a[i][q-1]; } } for(i=0;i<n;i++){ for(j=0;j<m;j++) printf("%d ",a[i][j]); printf("\n"); } }
#include <stdio.h> int main() { int a[15][15],b[15][15]; int i,j,n,m,flag=1,k; scanf("%d%d",&n,&m); for(i=0;i<n;i++){ for(j=0;j<m;j++){ scanf("%d",&a[i][j]); } } scanf("%d",&k); while(k--){ char ch; getchar(); ch=getchar(); int x,y; scanf("%d%d",&x,&y); x--; y--; if(ch=='r'){ for(j=0;j<m;j++){ int t=a[x][j]; a[x][j]=a[y][j]; a[y][j]=t; } }else if(ch=='c'){ for(i=0;i<n;i++){ int t=a[i][x]; a[i][x]=a[i][y]; a[i][y]=t; } } } for(i=0;i<n;i++){ for(j=0;j<m;j++){ printf("%d ",a[i][j]); } printf("\n"); } }
#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> 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; }
#include<bits/stdc++.h> using namespace std; int main() { int hang,lie; cin>>hang>>lie; //矩阵初始化 int arr[hang][lie],arr_num; for(int i = 0;i<hang;i++){ for(int j = 0;j<lie;j++){ cin>>arr_num; arr[i][j] = arr_num; } } int k; int a,b; char c1 = 'r',c2 = 'c',t; cin>>k; do{ cin>>t>>a>>b; //行置换 if(t == c1){ for(int i = 0;i<hang;i++){ for(int j = 0;j<lie;j++){ if(i == (a-1)){ int temp = arr[b-1][j]; arr[b-1][j] = arr[a-1][j]; arr[a-1][j] = temp; } } } } //列置换,也要加判断条件,不能只是else else if(t == c2){ for(int i = 0;i<hang;i++){ for(int j = 0;j<lie;j++){ if(j == a -1){ int temp = arr[i][b-1]; arr[i][b-1] = arr[i][a-1]; arr[i][a-1] = temp; } } } } //保证多次操作只输入结果一次 if(k == 1){ for(int i = 0;i<hang;i++){ for(int j = 0;j<lie;j++){ cout<<arr[i][j]<<" "; } cout<<endl; } } k--; }while(k>0); }
int main() { int n = 0, m = 0; scanf("%d%d", &n, &m); int arr[10][10] = { 0 }; int i = 0, j = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &arr[i][j]); } } int k = 0; scanf("%d", &k); int a = 0, b = 0; char t=' '; //循环k次 while(k) { getchar();//将缓冲区内空格或回车清除 scanf("%c%d%d",&t,&a, &b); //行转换 //每次换行或列,需要相对应的减一 if (t == 'r') { for (j = 0; j < m; j++) { int temp = arr[a-1][j]; arr[a-1][j] = arr[b-1][j]; arr[b-1][j] = temp; } } //列转换 else if (t == 'c') { for (i = 0; i < n; i++) { int temp = arr[i][a-1]; arr[i][a-1] = arr[i][b-1]; arr[i][b-1] = temp; } } //其它字符直接跳过 else { break; } k--; } //输出 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
int main() { int n, m = 0; int arr[10][10] = {0}; scanf("%d %d",&n,&m); int i = 0; for (i=0;i<n;i++) { int j = 0; for (j=0;j<m;j++) { scanf("%d",&arr[i][j]); } } int k = 0; scanf("%d",&k); char t = 0; int a, b = 0; int tmp = 0; while (k) { //注释解释: //scanf(" %c", &c); //为什么要加在%c前空格 //在scanf语句中的%c前面加一个空格。如果没有加的话在我们输入第一个字符并以空格结束输入后,该字符与’\n’会一起进入标准流输入,’\n’便会作为第二个scanf语句的内容输入,从而让你的程序出现问题。 scanf(" %c %d %d", &t, &a, &b); //或 //按照输入读入,注意r c 读入时有个空格,然后要用getchar吃掉空格,然后正常读入 //t = getchar(); //scanf("%d %d", &a, &b); if (t=='r') { int j = 0; for (j=0;j<m;j++) { tmp = arr[a - 1][j]; arr[a - 1][j] = arr[b-1][j]; arr[b - 1][j] = tmp; } } else if(t=='c') { for (i = 0; i < n; i++) { tmp = arr[i][a - 1]; arr[i][a-1] = arr[i][b-1]; arr[i][b - 1] = tmp; } } k--; } for (i = 0; i < n; i++) { int j = 0; 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 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 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; }
m,n = map(int,input().split()) x = list(input().split() for _ in range(m)) k = int(input()) for _ in range(k): t,a,b = input().split() if t == 'r': i = x[int(a)-1] x[int(a)-1] = x[int(b)-1] x[int(b)-1] = i elif t == 'c': for i in range(m): p = x[i][int(a)-1] x[i][int(a)-1] = x[i][int(b)-1] x[i][int(b)-1] = p for i in x: print(*i)
#include<stdio.h> int main(){ int n,m,i,j,a,b,c,temp; char op; scanf("%d %d",&n,&m); int A[n][m]; for(i=0;i<n;i++){ for(j=0;j<m;j++){ scanf("%d",&A[i][j]); } } scanf("%d",&c); for(i=0;i<c;i++){ getchar(); //这里加getchar吸收空格吗? scanf("%c %d %d",&op,&a,&b); //那为什么这里不加getchar if(op=='r'){ for(j=0;j<m;j++){ temp=A[a-1][j]; A[a-1][j]=A[b-1][j]; A[b-1][j]=temp; } } else if(op=='c'){ for(i=0;i<n;i++){ temp=A[i][a-1]; A[i][a-1]=A[i][b-1]; A[i][b-1]=temp; } } } for(i=0;i<n;i++){ for(j=0;j<m;j++){ printf("%d ",A[i][j]); } printf("\n"); } return 0; }铁汁,这段代码只能通过50%的用例,错在哪里了,谢谢大佬指点,还有备注里面也有一个小疑点。谢谢大佬!!
#include<stdio.h> int main() { int n,m; scanf("%d %d",&n,&m); int i,j,array[n][m]; for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%d",&array[i][j]); } } int k; scanf("%d",&k); while(k--) { getchar(); char ch; ch=getchar(); int a,b,temp=0; scanf("%d %d",&a,&b); if(ch=='r') { for(j=0;j<m;j++) { temp=array[a-1][j]; array[a-1][j]=array[b-1][j]; array[b-1][j]=temp; } } if(ch=='c') { for(i=0;i<n;i++) { temp=array[i][a-1]; array[i][a-1]=array[i][b-1]; array[i][b-1]=temp; } } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%d ",array[i][j]); } printf("\n"); } return 0; }
row,col = map(int,input().split()) arr = list(input().split() for _ in range(row)) k = int(input()) for _ in range(k): r,n,m = input().split() n = int(n)-1 m = int(m)-1 if r=="r": arr[n],arr[m] = arr[m],arr[n] elif r=="c": for i in range(row): arr[i][n],arr[i][m] = arr[i][m],arr[i][n] else: pass for i in arr: print(*i)