XMU2018摸底测试 星际战争I(Easy)

本文介绍了一款基于数学规律的轰炸模拟算法,用于解决在有限的星球地图中,通过已知的轰炸次数和破坏情况推算未知格子受到的伤害值。该算法巧妙利用了每枚炸弹对星球造成的固定伤害规律。

星际战争I(Easy)

Description(描述)

现在是星际战争的第一个年头。
绝地武士躲藏在一颗大小为N \times MN×M 的矩形二维星球上。
贸易联盟想要消灭他们,但是经历过之前的战斗之后,贸易联盟知道:
铁罐头是打不过绝地武士的!
所以他们决定展开轰炸。
受限于技术,贸易联盟的轰炸机无法轰炸星球的边缘(最靠外的格子)。
丢下一枚炸弹会对目标格造成4点破坏,对具有邻边的4个格子造成1点伤害。
可以重复轰炸同一个格子,所有格子的伤害值累加

00000
00100
01410
00100
00000

经过Q次轰炸之后,贸易联盟获得了对这个星球破坏状况的信息,除了一个格子之外。
你的上级交给了你一个任务,要你给你自己的脑袋写个程序,来计算对这个格子的伤害。

Format(格式)

Input(输入格式)

输入第一行为三个正整数N,M,Q (0< N,M <=10, 1<=Q<=3),表示星球的行数、列数和轰炸次数
接下来N行M列的矩阵,a_{i,j}ai,j表示星球土地(i,j)上的伤害值,-1表示未知位置
(左上角为(1,1),右下角为(n,m))
数据保证除了未知位置外,其余数字的值满足0 <= a_{i,j} <= 200<=ai,j<=20
数据保证合法解存在

Output(输出格式)

输出仅一行一个数字,表示未知位置的伤害值。

Sample (样例)

Input(样例输入)

5 5 2
0 0 0 0 0
0 0 2 0 0
0 2 -1 2 0
0 0 2 0 0
0 0 0 0 0

Output(样例输出)

8

Limitation(限制)

时间限制:1s
空间限制:128MB

Hint(提示)

Source(来源)

Vijos Original



题目链接

    https://www.vijos.org/d/XMU_ACM/p/5a9a3ea2d3d8a1371223e331

题目大意

    给一个n*m(<=10)的网格,和轰炸次数(<=3),每次轰炸会使被轰炸格子+4,相邻四个格子+1

    已知包含一个未知格子的网格状态,求未知格子的值

题目思路

    【数学规律】

    由分析可知,每一枚炸弹必然对星球造成8点伤害,所以8*炸弹数-已知的伤害总和,即是未知格子受到的伤害
    另一种比较麻烦的做法是:
    考虑到最多只会丢下3发炸弹,所以可以把格子分为损害值> 3和损害值<=3的两类。其中<=3的格子,必定不是受到直接轰炸的格子。

    我们可以筛选出> 3的点,把四周的轰炸伤害的值扣除,最终也能得到答案。


#define _CRT_SECURE_NO_WARNINGS
/****************************************************

Author : Coolxxx
Copyright 2018 by Coolxxx. All rights reserved.
BLOG : http://blog.csdn.net/u010568270

****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
#define N 104
const double EPS = 1e-8;
const int J = 10;
const int MOD = 1000000007;
const int MAX = 0x7f7f7f7f;
const int inf = 100;
using namespace std;
int n, m, lll, ans, cas;
int main()
{
#ifndef ONLINE_JUDGE
	//freopen("1.txt", "r", stdin);
	//freopen("2.txt", "w", stdout);
#endif
	int i, j, k;
	int x, y, z;
	while (~scanf("%d%d", &n, &m) && n && m)
	{
		ans=0;
		scanf("%d",&cas);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%d",&x);
				if(x==-1)continue;
				if((i+j)&1)ans+=x;
				else ans-=x;
			}
		}
		printf("%d\n",abs(ans));
	}
	return 0;
}
/*
//

//
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值