首页 > 试题广场 >

明日DISCO

[编程题]明日DISCO
  • 热度指数:1203 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
燃烧的梦想是最初的歌
相信自己其实你眼光仍清澈
就在你许下 愿望的那刻
让那天空铺上绚丽的颜色
——阿良良木健《明日DISCO》

你有一个 n+2 行,n+2 列的正方形棋盘,行和列的编号都是 0,1,\dots, n+1

这个棋盘上的每个格子都有一个数。棋盘的第 0 行、第 0 列、第 n+1 行、第 n+1 列的所有数都是 0。记坐标为 (x,y) 个格子上的数为 a_{x,y}

你可以执行任意次操作。操作有两种类型:

1. 选择一个格子 (x,y) 满足 1\le x,y\le na_{x,y} 均大于它上下左右的 4 个数,将 a_{x,y} 减去 1

2. 选择一个格子 (x,y) 满足 1\le x,y\le na_{x,y} 均小于它上下左右的 4 个数,将 a_{x,y} 加上 1

问你最后能否使得这个棋盘上的所有数均相等。

输入描述:
第一行一个数 n

接下来 n 行,每行 n 个数。第 i 行的第 j 个数表示 a_{i,j}

( 1 \le n \le 500,-10^9 \le a_{i,j} \le 10^9)


输出描述:
如果可以,请输出一行一个字符串 YES,否则输出 NO。
示例1

输入

1
1

输出

YES
示例2

输入

2
0 0
1 1

输出

NO
示例3

输入

2
0 0
-1 0

输出

YES

备注:

头像 Lambda_L
发表于 2026-01-07 00:56:21
思路因为边界永远是 0,而且不能改,所以最终所有数相等的话,只可能等于 0。所以问题转化为:能不能把所有 数变成 0。如果当前是负数,且四个邻居都 >= 0,它可以一直增加到 0如果当前为正数,同理;最后检查是否全为0就行了代码 #include<bits/stdc++.h> us 展开全文
头像 kilomatutinal
发表于 2026-01-07 01:34:53
喵~主人想让我来解释这个喵!(歪头)你想象一下呐,这个棋盘就像一片有很多小土堆和小坑坑的沙滩喵~边界那一圈都是平平的(都是0哦)。我们现在要做的事情,就是把沙滩弄得平平的(全部变成0),就可以舒服地躺在上面晒太阳啦喵~规则很简单呢喵!如果有个小土堆比周围四个地方都高(就像猫猫堆的小沙堆),就可以把它 展开全文
头像 TimothyStarman
发表于 2026-01-07 01:37:29
思路 设棋盘二维数组 arr[i][j] 对于 ,有 使得 ,那么就代表可行。那么有以下贪心策略成立: 数组 时,continue;。 数组 且四个方向均小于 0,那么 可以降为 0,否则不做处理。 数组 且四个方向均大于 0,那么 可以升为 0,否则不做处理。 最后判断每一个 展开全文
头像 Jakeap
发表于 2026-01-07 10:24:48
思路:这题你要发现题目的漏洞,保证所有的数都相等,那么处于0和处于n+1位置的所有数一直是0(也就是棋盘边上的一圈位置一直是0),因为其不能被调整。那么就转换为了将所有数都按照规则转换全部都转换为0即可。要求是比周围都大可以减一,比周围都小加一,但是如果两个相邻数都是正数,那么变换到最后最多就是相等 展开全文
头像 Vie_SQ
发表于 2026-01-07 10:38:23
//最后一定全变成0,每两个直接相邻的数一定只能变成他俩中间的数,所以每两个相邻的数 组成的区间必须包含0. //满足该条件后,每个数字必定可以增加或减少变成0.并且与操作顺序无关,必定能操作。 #include <iostream> #include <vector> 展开全文
头像 quchen666
发表于 2026-01-07 12:17:15
#include <bits/stdc++.h> using namespace std; const int N = 1e3+10; int a[N][N]; int dir[4][2]={1,0,-1,0,0,-1,0,1}; int main() { ios::sync 展开全文
头像 BeauWill
发表于 2026-01-07 00:22:21
对于每个位置,我们都贪心的尝试修改,如果可以修改,就把它修改为四个方向中的最大值和最小值(具体看它满足哪个条件)。其实这里修改后的值不为0,已经可以输出"NO"并return了。这是因为第0,n+1的行和列是不能修改的,要想使整个正方形棋盘的值都相等,只能整个棋盘上的数都为0。而 展开全文
头像 RogeAustine
发表于 2026-01-07 00:34:08
首先这个题我们并不需要真的去修改这个方阵,因为我们注意到边界都是0,那么我们一定要保证所有的元素最后都可以,注意是可以,变成0.那么我们就考虑什么时候一个非0的元素可以变为0,其实就是对于这个元素的四个方向,每个方向的元素与该元素的乘积都要小于等于0就可以,因为如果异号的话,这个元素就有足够大的空间 展开全文
头像 此在Dasein
发表于 2026-01-07 06:35:38
这是一个经典的网格操作与稳定性分析问题。我们可以通过分析操作的性质、状态的单调性以及“死锁”条件来得出一个基于贪心策略或事件驱动模拟的算法。 问题分析 我们需要判断是否可以通过有限次操作将整个网格的所有数值变为 0。 操作规则是:局部最大值可以减小,局部最小值可以增加。这实际上是一个能量最小化或平滑 展开全文
头像 olone
发表于 2026-01-07 10:01:33
#include <iostream> using namespace std; const int N=505; int n; int a[N][N]; int dx[4]={1,0,0,-1}; int dy[4]={0,1,-1,0}; int main() { s 展开全文