Codeforces Global Round 9 参与排名人数10372
[codeforces 1375B] Neighbor Grid 每个格子都填入相应的最大邻居数量(构造)
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1375/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Neighbor Grid | GNU C++17 | Accepted | 46 ms | 4400 KB |
题目大意:给定n*m的网格,若某个格子中的数据是k,大于0,表示这个格子有k个邻居(这k个邻居格子里的数据大于等于0),可以对每个格子的数据进行+1操作,操作次数不限,要求每个格子中的数据k都能对应上真实的邻居。输出变化后的网格数据。
样例模拟如下:
3 4
0 0 0 0
0 1 0 0
0 0 0 0
YES
2(最多有2个邻居) 3(最多有3个邻居) 3(最多有3个邻居) 2(最多有2个邻居)
3(最多有3个邻居) 4(最多有4个邻居) 4(最多有4个邻居) 3(最多有3个邻居)
2(最多有2个邻居) 3(最多有3个邻居) 3(最多有3个邻居) 2(最多有2个邻居)
2 2
(3) 0
0 0
(2) 2
2 2
格子(1,1)上数据3>2,故输出NO
2 2
0 0
0 0
YES
2 2
2 2
2 3
0 0 0
0 (4) 0
2 3 2
2 (3) 2
格子(2,2)上数据4>3,故输出NO
4 4
0 0 0 0
0 2 0 1
0 0 0 0
0 0 0 0
YES
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
AC代码如下:
#include <stdio.h>
#define maxn 310
int a[maxn][maxn],b[maxn][maxn];
int next[][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main(){
int t,n,m,k,nr,nc,r,c,flag,cnt;
scanf("%d",&t);
while(t--){
flag=0;
scanf("%d%d",&n,&m);
for(r=1;r<=n;r++)
for(c=1;c<=m;c++)
scanf("%d",&a[r][c]);
for(r=1;r<=n;r++){
for(c=1;c<=m;c++){
cnt=0;//计算该格子的邻居数量
for(k=0;k<4;k++){
nr=r+next[k][0];
nc=c+next[k][1];
if(1<=nr&&nr<=n&&1<=nc&&nc<=m)cnt++;
}
if(a[r][c]>cnt){printf("NO\n"),flag=1;break;}//原有的邻居数量>最大可能的邻居数量,不现实,输出NO.
b[r][c]=cnt;
}
if(flag)break;
}
if(flag)continue;
printf("YES\n");
for(r=1;r<=n;r++){
for(c=1;c<=m;c++)
printf("%d ",b[r][c]);
printf("\n");
}
}
return 0;
}