洛谷 P1789 【Mc生存】插火把

题目描述

话说有一天 linyorson 在“我的世界”开了一个 �×�n×n 的方阵,现在他有 �m 个火把和 �k 个萤石,分别放在 (�1,�1)∼(��,��)(x1​,y1​)∼(xm​,ym​) 和 (�1,�1)∼(��,��)(o1​,p1​)∼(ok​,pk​) 的位置,没有光并且没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?

P.S. 火把的照亮范围是:

    |暗|暗| 光 |暗|暗|
    |暗|光| 光 |光|暗|
    |光|光|火把|光|光|
    |暗|光| 光 |光|暗|
    |暗|暗| 光 |暗|暗|

萤石:

    |光|光| 光 |光|光|
    |光|光| 光 |光|光|
    |光|光|萤石|光|光|
    |光|光| 光 |光|光|
    |光|光| 光 |光|光|

输入格式

输入共 �+�+1m+k+1 行。
第一行为 �,�,�n,m,k。
第 22 到第 �+1m+1 行分别是火把的位置 ��,��xi​,yi​。
第 �+2m+2 到第 �+�+1m+k+1 行分别是萤石的位置 ��,��oi​,pi​。

注:可能没有萤石,但一定有火把。

输出格式

有几个点会生出怪物。

输入输出样例

输入 #1复制

5 1 0
3 3

输出 #1复制

12

说明/提示

数据保证,1≤�≤1001≤n≤100,1≤�+�≤251≤m+k≤25,1≤�≤251≤m≤25,0≤�≤50≤k≤5。

i-2i-1ii+1i+2
j-2y
j-1yyy
jyyyy
j+1yyy
j+2y

【题目大意】

给你一块n * n的地和萤石、火把若干
萤石可以照亮以自身为中心5 * 5的矩阵
火把可以照亮上下左右各两格。
四个方向对角线上各一格
求没法被照亮的方块块数

【题目分析】

读入数据
因为只有萤石和火把这两种可能
所以用if判断一下放置的是什么就好了
然后如果是火把
那就将他的上下左右的两个和对角线四个方向上各一格都标为亮了
如果是萤石
那就将以他为中心的5 * 5的矩阵上面每一个方块都标为亮的
标记的话可以用for循环来标记
也可以直接if标记

【注意】

放置了火把和萤石的方块是亮的
不会生成怪物。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int m,n,k,x,y,sum=0;
    cin>>m>>n>>k;
	int a[m+5][m+5]={};
	for(int i=0;i<n;i++){
		cin>>x>>y;
		x--,y--;
		a[x][y]=1,a[x-1][y]=1,a[x-2][y]=1,a[x+1][y]=1,a[x+2][y]=1;
		a[x][y+1]=1,a[x][y+2]=1,a[x][y-1]=1,a[x][y-2]=1;
		a[x-1][y-1]=1,a[x+1][y+1]=1,a[x-1][y+1]=1,a[x+1][y-1]=1;
	}
	for(int i=0;i<k;i++){
		cin>>x>>y;
		x-=3,y-=3;
		for(int j=x;j<x+5;j++)
			for(int k=y;k<y+5;k++)a[j][k]=1;
	}
	for(int i=0;i<m;i++)
		for(int j=0;j<m;j++)if(!a[i][j])sum++;
	cout<<sum;
}
要实现对任意M*N的矩阵进行对角线交换,您可以使用以下代码: ```cpp #include <iostream> using namespace std; int main() { int m, n; cout << "请输入矩阵的行数:"; cin >> m; cout << "请输入矩阵的列数:"; cin >> n; int matrix[100][100]; // 输入矩阵元素 cout << "请输入矩阵的元素:" << endl; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << "请输入第" << i + 1 << "行,第" << j + 1 << "列的元素:"; cin >> matrix[i][j]; } } // 输出原始矩阵 cout << "原始矩阵为:" << endl; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } // 对角线交换 if (m == n) { for (int i = 0; i < m; i++) { int temp = matrix[i][i]; matrix[i][i] = matrix[i][n - i - 1]; matrix[i][n - i - 1] = temp; } cout << "对角线交换后的矩阵为:" << endl; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } } else { cout << "输入的矩阵不是方阵,无法进行对角线交换。" << endl; } return 0; } ``` 这段代码首先接受用户输入的矩阵的行数和列数,然后使用一个二维数组 `matrix` 来存储矩阵元素。接下来,用户需要输入矩阵的元素,然后原样输出输入的矩阵。 如果输入的矩阵是方阵(即行数和列数相等),则进行对角线交换。对角线交换的原理是,通过遍历主对角线上的元素,将其与对应位置的副对角线上的元素进行交换。最后,输出交换后的矩阵。 如果输入的矩阵不是方阵,则会显示一条错误消息,因为只有方阵才能进行对角线交换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值