思路:用贪心去做,题目的大概意思就是给你一个n行m列的数组,现在要求二维数组中的每一个位置的元素值的多少都要对应于周围有多少个相邻的不为0的数的个数,你可以给任意位置的数组元素变大,看看能不能满足这种情况。
你会发现最大的情况就是类似下面这样
那么我只要去遍历一遍所给的数组,如果相应位置中的元素比最大情况中的还要大的话,那就无法满足。
#include<bits/stdc++.h>
using namespace std;
int a[310][310],b[310][310];
int main()
{
int t; cin>>t;
while(t--){
int flag = 1;
int n,m; cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if((i==0&&j==0)||(i==0&&j==m-1)||(i==n-1&&j==0)||(i==n-1&&j==m-1))
b[i][j]=2;
else if(i==0||j==0|i==n-1||j==m-1)
b[i][j]=3;
else
b[i][j]=4;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]>b[i][j]){
flag=-1;
break;
}
}
}
if(flag == -1) cout<<"NO"<<endl;
else {
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
}
return 0;
}