T01 矩阵交换行

描述

给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。

输入

输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第6行包含两个整数m、n,以一个空格分开。(1 <= m,n <= 5)

输出

输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。

样例输入

样例输出

样例

 #include<iostream>
using namespace std;
int n,m;
int a[][];
int main()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++) cin>>a[i][j];
cin>>m>>n;
for(int i=;i<=;i++)
if(i==m)
{
for(int j=;j<=;j++) cout<<a[n][j]<<' ';
cout<<endl;
}
else if(i==n)
{
for(int j=;j<=;j++) cout<<a[m][j]<<' ';
cout<<endl;
}
else
{
for(int j=;j<=;j++) cout<<a[i][j]<<' ';
cout<<endl;
} }

T02 同行列对角线的格子

描述

输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中(行列均从1开始编号),与格子(i,j)同行、同列、同一对角线的所有格子的位置。

如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:

第一列

第二列

第三列

第四列

 
       

第一行

   

(2,3)

 

第二行

       

第三行

       

第四行

当n=4,i=2,j=3时,输出的结果是:

(2,1) (2,2) (2,3) (2,4)                        同一行上格子的位置

(1,3) (2,3) (3,3) (4,3)                        同一列上格子的位置

(1,2) (2,3) (3,4)                              左上到右下对角线上的格子的位置

(4,1) (3,2) (2,3) (1,4)                        左下到右上对角线上的格子的位置

输入

一行,三个自然数N,i,j,相邻两个数之间用单个空格隔开。1 <= N <= 10。

输出

四行:
第一行:从左到右输出同一行格子位置;
第二行:从上到下输出同一列格子位置;
第三行:从左上到右下输出同一对角线格子位置;
第四行:从左下到右上输出同一对角线格子位置。

其中每个格子位置用如下格式输出:(x,y),x为行号,y为列号,采用英文标点,中间无空格。
相邻两个格子位置之间用单个空格隔开。

样例输入

样例输出

(,) (,) (,) (,)
(,) (,) (,) (,)
(,) (,) (,)
(,) (,) (,) (,)

样例

输出左上到右下的对角线时,注意分x>y和x<y的情况讨论

输出左下到右上的对角线分成两段,在给定格子左下方的回溯输出

输出时用printf格式化输出比cin更方便

#include<iostream>
#include<cstdio>
using namespace std;
int a[][],n,x,y;
void dg(int i,int j)//在给定格子左下方的部分回溯输出
{
if(i==n+||j==) return;
dg(i+,j-);
printf("(%d,%d) ",i,j);
}
void dg2(int i,int j)//给定格子右上方的递归直接输出
{
if(i==||j==n+) return;
printf("(%d,%d) ",i,j);
dg2(i-,j+);
}
int main()
{
cin>>n>>x>>y;
for(int i=;i<=n;i++)
printf("(%d,%d) ",x,i);
cout<<endl;
for(int i=;i<=n;i++)
printf("(%d,%d) ",i,y);
cout<<endl;
int c=x-y;
if(c<=)//x<y
{
for(int i=;i-c<=n;i++)
printf("(%d,%d) ",i,i-c);
}
else if(c>)//x>y
{
for(int i=;i+c<=n;i++)
printf("(%d,%d) ",i+c,i);
}
cout<<endl;
dg(x,y);
dg2(x-,y+);
}

T03 计算矩阵边缘元素之和

描述

输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

输入

第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。
接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。

输出

输出对应矩阵的边缘元素和

样例输入

样例输出

样例

#include<iostream>
using namespace std;
int s;
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int x;
cin>>x;
if(i==||i==n||j==||j==m) s+=x;
}
cout<<s;
}

T04 错误探测

描述

给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。 
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。 
"改变矩阵元素"的操作定义为0变成1或者1变成0。


输入

输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。

输出

如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。

样例输入
样例输入1 样例输入2 样例输入3 样例输出
样例输出1
OK 样例输出2 样例输出3
Corrupt

样例

因为元素只是0或1,所以统计每一行和每一列的和。

满足第二条要求,当且仅当行和列各有一个的和是奇数才行。可以先判断是否满足这个情况,

如果满足,输出记录下来的第一个行、列为奇数的坐标(如果有多个,那么一定不满足这个条件,所以只需要记录第一个)

如果不满足,则要么行或列有一个的和为奇数,要么和或列至少有一个出现多个和为奇数的情况,这两种情况都不满足要求,所以只需要再判断是否还有和为奇数的行或列即可,有则不符合以上两条,输出Corrupt,没有则输出OK

 #include<iostream>
using namespace std;
int h[],l[];
int n;
int x,y,dx,dy;//x统计和为奇数的行的总数,y统计列,dx为第一个出现行为奇数的行号,dy为列号
int main()
{
cin>>n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int x;
cin>>x;
h[i]+=x;
l[j]+=x;
}
for(int i=;i<=n;i++)
{
if(h[i]&) x++,dx=i;
if(l[i]&) y++,dy=i;
}
if(x==&&y==) cout<<dx<<' '<<dy;
else if(x>||y>) cout<<"Corrupt";
else cout<<"OK";
}

开始做时有两个错误:

① 在for循环第二个if判断前加了else,卡了好久

② 输出判断的x>1||y>1,忽略了只有一行或者一列为奇数也不满足条件

T05计算鞍点

描述

给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。
鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25


输入

输入包含一个5行5列的矩阵输出如果存在鞍点,

输出

鞍点所在的行、列及其值,如果不存在,输出"not found"

可以证明一个矩阵只存在一个鞍点。

证明:(3*4矩阵为例)

a,b,c,d

e,f,g,h

j,k,m,n

若e为鞍点,则e为第2行的最大值,第1列的最小值。假设m点另一个鞍点。因为e为鞍点,所以j>e,g<e,所以g<j;因为m为鞍点,所以j<m,g>m,所以j<g,矛盾,所以m不是鞍点,以此类推,可证明矩阵只有一个鞍点

样例输入

样例输出
  

样例

#include<iostream>
using namespace std;
int a[][];
bool ok;
int main()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
cin>>a[i][j];
for(int i=;i<=;i++)//枚举每一行
{
int max_h=-0x7fffffff,k=;//max_h,当前行的最大值;k,max_h所在列
for(int j=;j<=;j++)
if(a[i][j]>max_h)
{
max_h=a[i][j];k=j;
}
int min_l=0x7fffffff,q=;//min_l,第k列的最小值;q,min_l所在行
for(int l=;l<=;l++)
if(a[l][k]<min_l)
{
min_l=a[l][k];q=l;
}
if(q==i)
{
cout<<i<<' '<<k<<' '<<a[i][k];
return ;
}
}
cout<<"not found";
}

开始赋值最大值时0x7f是错误的,0x7f为127,不够大,int范围内最大值为0x7fffffff

T06 图像相似度

描述

给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。

说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。

输入

第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。

输出

一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。

样例输入

样例输出
44.44

样例

注意int与double的类型转换

#include<iostream>
#include<cstdio>
using namespace std;
int m,n,a[][],s;
int main()
{
cin>>m>>n;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
cin>>a[i][j];
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
{
int x;
cin>>x;
if(x==a[i][j]) s++;
}
double k=(double)s/(n*m);
k*=;
printf("%.2lf",k);
}

 T07 矩阵归零消减序列和

描述

给定一个n*n的矩阵(3 <= n <= 100,元素的值都是非负整数)。通过(n-1)次实施下述过程,可把这个矩阵转换成一个1*1的矩阵。每次的过程如下:

首先对矩阵进行行归零:即对每一行上的所有元素,都在其原来值的基础上减去该行上的最小值,保证相减后的值仍然是非负整数,且这一行上至少有一个元素的值为0。

接着对矩阵进行列归零:即对每一列上的所有元素,都在其原来值的基础上减去该列上的最小值,保证相减后的值仍然是非负整数,且这一列上至少有一个元素的值为0。

然后对矩阵进行消减:即把n*n矩阵的第二行和第二列删除,使之转换为一个(n-1)*(n-1)的矩阵。

下一次过程,对生成的(n-1)*(n-1)矩阵实施上述过程。显然,经过(n-1)次上述过程, n*n的矩阵会被转换为一个1*1的矩阵。

请求出每次消减前位于第二行第二列的元素的值。

输入

第一行是一个整数n。
接下来n行,每行有n个正整数,描述了整个矩阵。相邻两个整数间用单个空格分隔。

输出

输出为n行,每行上的整数为对应矩阵归零消减过程中,每次消减前位于第二行第二列的元素的值。

样例输入

样例输出

样例

每次找出每一行的最小值减去,找出每一列的最小值减去,删除第二行第二列时,for循环一个一个挪过去

本题题意描述有点儿问题,每次消除第二行、第二列,只有n-1个(2,2),所以当行、列等于1时,输出上一步的(2,2)才能AC

 #include<iostream>
using namespace std;
int a[][];
int h[],l[];
int main()
{
int n; cin>>n;
for(int i=;i<=n;i++) for(int j=;j<=n;j++) cin>>a[i][j];
int s=n;
for(int k=;k<=s;k++)
{
cout<<a[][]<<endl;
for(int i=;i<=n;i++) h[i]=a[i][];
for(int i=;i<=n;i++) for(int j=;j<=n;j++) h[i]=min(h[i],a[i][j]);
for(int i=;i<=n;i++) for(int j=;j<=n;j++) a[i][j]-=h[i];
for(int i=;i<=n;i++) l[i]=a[][i];
for(int i=;i<=n;i++) for(int j=;j<=n;j++) l[j]=min(l[j],a[i][j]);
for(int i=;i<=n;i++) for(int j=;j<=n;j++) a[i][j]-=l[j];
if(n>)
{
for(int i=;i<=n;i++) for(int j=;j<n;j++) a[i][j]=a[i][j+];
for(int i=;i<n;i++) for(int j=;j<=n;j++) a[i][j]=a[i+][j];
n--;
}
}
}

删除第二行第二列时,要先判断n是否大于2,大于才删,开始时没注意

删除第二行第二列时for循环总觉得很麻烦,又想不出其他方法,欢迎各路大神指点

T08 矩阵加法

描述

输入两个n行m列的矩阵A和B,输出它们的和A+B。

输入

第一行包含两个整数n和m,表示矩阵的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。
接下来n行,每行m个整数,表示矩阵B的元素。
相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。

输出

n行,每行m个整数,表示矩阵加法的结果。相邻两个整数之间用单个空格隔开。

样例输入

样例输出

样例

矩阵加法:矩阵A+矩阵B=两矩阵相同行相同列的元素相加。例:

1,2,3          2,1,3          1+2,2+1,3+3

4,5,6    +    1,1,2    =    4+1,5+1,6+2

7,8,9          2,0,0          7+2,8+0,9+0

 #include<iostream>
using namespace std;
int n,m;
int a[][];
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int x;
cin>>x;
a[i][j]+=x;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
}

T09 矩阵乘法

描述

计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j](C[i][j]表示C矩阵中第i行第j列元素)。

输入

第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。

输出

输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。

样例输入

样例输出

样例

矩阵乘法:(n*m矩阵A)*(m*k矩阵B)=(n*k矩阵C) 矩阵C中第i行j列的值等于,矩阵A中第i行的值,依次乘矩阵B中第j列的值。例:

1,2           7,8,4           1*7+1*2+2*7+2*2,  1*8+1*1+2*8+2*1, 1*4+1*3+2*4+2*3

3,4    乘    2,1,3   等于   3*7+3*2+4*7+4*2, 3*8+3*1+4*8+4*1, 3*4+3*3+4*4+4*3

5,6                             5*7+5*2+6*7+6*2, 5*8+5*1+6*8+6*1, 5*4+5*3+6*4+6*3

#include<iostream>
using namespace std;
int n,m,k;
int a[][],b[][],c[][];
int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
for(int i=;i<=m;i++)
for(int j=;j<=k;j++)
cin>>b[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int l=;l<=k;l++)
c[i][l]+=a[i][j]*b[j][l];
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
cout<<c[i][j]<<' ';
cout<<endl;
}
}

1

#include<iostream>
using namespace std;
int n,m,k;
int a[][],b[][],c[][];
int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
for(int i=;i<=m;i++)
for(int j=;j<=k;j++)
cin>>b[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=k;j++)
for(int l=;l<=m;l++)
c[i][j]+=a[i][l]*b[l][j];
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
cout<<c[i][j]<<' ';
cout<<endl;
}
}

2

T10 矩阵转置

描述

输入一个n行m列的矩阵A,输出它的转置AT

输入

第一行包含两个整数n和m,表示矩阵A的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。

输出

m行,每行n个整数,为矩阵A的转置。相邻两个整数之间用单个空格隔开。

矩阵转置即行列交换后输出。例:

样例输入

样例输出

样例

 #include<iostream>
using namespace std;
int n,m,a[][];
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
cout<<a[j][i]<<' ';
cout<<endl;
}
}

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T01——T10的更多相关文章

  1. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20

    T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= ...

  2. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

    T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为 ...

  3. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  4. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  5. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  6. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

  7. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

    T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替 ...

  8. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35

    T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...

  9. noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T36——T45

    T36 计算多项式的值 描述 假定多项式的形式为xn+xn-1+-+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入 输入仅一行,包括x和n,用单个空格隔开.x在flo ...

随机推荐

  1. BitTorrent Sync - 神奇的文件同步软件,无需服务器让多台电脑互相同步!

    176,487 微博 腾讯 空间 微信 141 49 如今人们对文件备份和同步的需求已经越来越强烈了.像 Dropbox 一样的云存储网盘有很多,但它们都有一个局限性,就是所有的文件都得经过它们的服务 ...

  2. Java集合框架的接口和类层次关系结构图

    Collection和Collections的区别 首先要说的是,"Collection" 和 "Collections"是两个不同的概念: 如下图所示,&qu ...

  3. 按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位

    package com.hanqi.test; public class Rect { ; ; public double getWidth() { return width; } public vo ...

  4. VPS拨号主机自动拨号脚本(centos7)

    问题:因公司会不定时购买大量VPS拨号主机,在部署环境的时候,首先要配置拨号,传统的拨号设置(pppoe-setup)配置比较繁琐,故写这个脚本方便拨号配置. #!/bin/bash ppp_user ...

  5. read

    从标准输入读入一行内容并以空格为分隔符赋值给变量,如果输入的内容过多,则把剩下的所有内容都赋值给最后一个变量 $read A B C 123 456 789 101 $echo "$A&qu ...

  6. 深度学习笔记------windows系统下进行Linux-Ubuntu14.04双系统安装笔记(二)

    在上一篇文章中介绍了新手如何安装Ubuntu14.04的双系统,本文会说明Ubuntu系统下搜狗输入法的安装,并就我遇见的一些bug给出最简单的解决办法. 第一部分.搜狗输入法的安装 本身搜狗输入法的 ...

  7. 时间同步出现ntpdate[1788]: the NTP socket is in use, exiting

    问题: [root@service ~]# ntpdate ntp.api.bz 17 Jun 19:22:23 ntpdate[2701]: the NTP socket is in use, ex ...

  8. 利用增量备份恢复因归档丢失造成的DG gap

    故障现象:data guard归档出现gap,悲剧的是丢失的归档在主库上被rman备份时删除了,丢失的归档大约有20几个,数据库大小约2T,如果重建DG将非常耗时间,因此决定利用增量备份的方式恢复DG ...

  9. 白话debounce和throttle

    遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件,如果不进行性能的优化,就可能会出现页面卡顿的现象,比如: 鼠标事件:mousemove(拖曳)/mouseover(划过)/mouseWhe ...

  10. Floyd算法解决多源最短路径问题

    Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. Floyd-Warshall算法 ...