[ACM]环形

Problem Description

有一个n*m的矩阵,对于每次询问,要求求出指定环形区域(大矩形扣去小矩形)的所有数字的和,并输出。

Input

输入的第一行为一个整数T,表示共有T组数据。
对于每一组数据,第一行输入两个整数n,m,表示矩阵的大小
接下来n行每行输入m个整数a,表示整个矩阵。
下面一行输入一个整数q,表示询问的组数
接下来q行,每行输入8个整数x1,y1,x2,y2,x3,y3,x4,y4。x1,y1和x4,y4是环形外圈矩形左上角和右下角的顶点坐标,x2,y2和x3,y3
是环形内圈小矩形的左上角和右下角的顶点坐标,详细情况参考样例。
1<=x1<=x2<x3<=x4<=n,1<=y1<=y2<y3<=y4<=m,1<n,m,q<=1000,0<=a<=10^9

Output

对于每组样例的每个询问输出指定的环形区域的数字的和,每个和占一行

Sample Input

1
4 4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
2
1 1 2 2 3 3 4 4
1 1 1 1 4 4 4 4

Sample Output

16

12

//方法一:大矩形减去小矩形
#include<iostream>

using namespace std;

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n,m;
		cin >> n>>m;
		int **a;                              //new二维数组
		a = new int *[n];
		for (int i = 0; i < n; i++)
			a[i] = new int[m];

		for (int i = 0; i < n; i++)//输入
			for (int j = 0; j < m; j++)
			{
				cin >> a[i][j];
			}
		int q;
		cin >> q;
		while (q--)
		{
			int x1, y1, x2, y2, x3, y3, x4, y4;
			cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
			x1 -= 1; x2 -= 1; x3 -= 1; x4 -= 1;
			y1 -= 1; y2 -= 1; y3 -= 1; y4 -= 1;
			int deleteSum = 0;
			int allSum = 0;
			for (int i = x1; i <= x4; i++)
			{
				for (int j = y1; j <=y4; j++)
				{
					allSum += a[i][j];
				}
			}
			for (int i = x2+1; i < x3; i++)
			{
				for (int j = y2+1; j < y3; j++)
				{
					deleteSum += a[i][j];
				}
			}
			cout << allSum-deleteSum << endl;
		}
		for (int i = 0; i < n; i++)
			delete[] a[i];
		delete[] a;
	}
}
//方法二:按行输入
#include<iostream>

using namespace std;

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n,m;
		cin >> n>>m;
		int **a;                              //new二维数组
		a = new int *[n];
		for (int i = 0; i < n; i++)
			a[i] = new int[m];

		for (int i = 0; i < n; i++)//输入
			for (int j = 0; j < m; j++)
				cin >> a[i][j];

		int q;
		cin >> q;
		while (q--)
		{
			int x1, y1, x2, y2, x3, y3, x4, y4;
			cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
			x1 -= 1; x2 -= 1; x3 -= 1; x4 -= 1;
			y1 -= 1; y2 -= 1; y3 -= 1; y4 -= 1;
			int sum = 0;
			for (int i = 0; i < n; i++)
			{
				if (i<=x2&&i>=x1|| i >= x3&&i <= x4)
					for (int j = y1; j <= y4; j++)
						sum += a[i][j];
				else if (i>x2&&i<x3)
				{
					for (int j = y1; j <= y2; j++)
						sum += a[i][j];
					for (int j = y3; j <= y4; j++)
						sum += a[i][j];
				}
			}
			cout << sum << endl;
		}
		for (int i = 0; i < n; i++)
			delete[] a[i];
		delete[] a;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值