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);
} #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 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 <iostream>
using namespace std;
int main() {
int c,d,e;
int a, b;
cin>>a>>b;
int arr[a][b];
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
cin>>arr[i][j];
}
}
cin>>c;
char f;
for(int i=0;i<c;i++)
{
cin>>f>>d>>e;
if(f=='r')
{
for(int j=0;j<b;j++)
{
int arr1[10][10];
arr1[d-1][j]=arr[d-1][j];
arr[d-1][j]=arr[e-1][j];
arr[e-1][j]=arr1[d-1][j];
}
}
if(f=='c')
{
for(int i=0;i<a;i++)
{
int arr1[10][10];
arr1[i][d-1]=arr[i][d-1];
arr[i][d-1]=arr[i][e-1];
arr[i][e-1]=arr1[i][d-1];
}
}
}
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
} 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;
}