1.矩形相交面积
问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
题目分析:
此题是一道利用程序解决简单数学问题的题目,重点是如何对所有的情况进行分类解决。同一平面内的两个矩形所有的情况可以分为两类,一类是两个矩形相离相交面积为0,一类是两个矩形相交,这时只需要把两个矩形的顶点横纵坐标从小到大排序然后取中间两项的差值,即为相交矩形的一条边。
#include<iostream>
#include<algorithm>
using namespace std;
double x[4], y[4];
int main()
{
cin >> x[0] >> y[0] >> x[1] >> y[1] >> x[2] >> y[2] >> x[3] >> y[3];
// 格式化输入,使输入都按照矩阵的左上角和右下角的顺序
if(x[0] > x[1]) swap(x[0], x[1]);
if(y[0] > y[1]) swap(y[0], y[1]);
if(x[2] > x[3]) swap(x[2], x[3]);
if(y[2] > y[3]) swap(y[2], y[3]);
//判断两种情况
if(x[0] < x[2] && x[1] < x[2] || x[2] < x[0] && x[3] < x[0] ||
y[0] < y[2] && y[1] < y[2] || y[2] < y[0] && y[3] < y[0])
printf("0.00\n");
else
{
sort(x, x + 4);
sort(y, y + 4);
printf("%.2f\n", (x[2] - x[1]) * (y[2] - y[1]));
}
return 0;
}
2.矩阵乘法
问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
题目分析:
矩阵相乘的公式为:
aij += aik * akj
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 40;
int a[N][N], b[N][N];
int res[N][N];
int n, m;
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
if(i == j) b[i][j] = 1;
}
memcpy(res, b, sizeof b); //当m=0时初始化,矩阵的0次方为n阶单位矩阵
while(m--)
{
memset(res, 0, sizeof res);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
res[i][j] += b[i][k] * a[k][j];
memcpy(b, res, sizeof res);
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%d ", res[i][j]);
puts("");
}
return 0;
}