Codeforces Global Round 9 - B. Neighbor Grid(贪心)

题目传送
题意:
给你一个二维数组,现在要求二维数组中的每一个位置的元素值的多少都要对应于周围有多少个相邻的不为0的数的个数。现在你每次可以对二维数组的元素加一,问是否能构造出这样的二维数组。

思路:
既然没有规定操作的次数,那么我们何不直接把操作数拉到最大再看呢?
Codeforces Global Round 9 - B. Neighbor Grid(贪心)_第1张图片
我们直接构造成这种矩阵即可。但是我们现在的操作只能加上某个数,所以如果最开始的初始矩阵的位置上的元素值大于上面的对应位置的的元素值就无法构造

AC代码

#include 
inline long long read(){
     char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {
     if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {
     x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 2e5 + 10;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const int mod = 1e9+7;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int way[4][2] = {
     {
     1,0},{
     -1,0},{
     0,1},{
     0,-1}};
signed main()
{
     
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    //    freopen("input.txt","r",stdin);
    //    freopen("output.txt","w",stdout);
    int t,n,m;
    cin >> t;
    while(t--)
    {
     
        cin >> n >> m;
        int arr[n+5][m+5] = {
     0},ans = 1;
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= m;j++)//判断最开始的初始矩阵是否是不可能构造的
            {
     
                cin >> arr[i][j];
                if(arr[i][j] > 4) ans = 0;
                if((i == 1 && j == 1) || (i == 1 && j == m) || (i == n && j == 1) || (i == n && j == m))
                {
     
                    if(arr[i][j] > 2) 
                        ans = 0;
                }
                else if(i == 1 || j == 1 || i == n || j == m)
                {
     
                    if(arr[i][j] > 3) 
                        ans = 0;
                }
            //这几个位置就是矩形的外围一圈,对这一圈要进行特判
            }
        if(ans)//满足条件后,就进行贪心构造
        {
     
            cout << "YES" << endl;
            for(int i = 1;i <= n;i++)
            {
     
                for(int j = 1;j <= m;j++)
                {
     
                    if((i == 1 && j == 1) || (i == 1 && j == m) || (i == n && j == 1) || (i == n && j == m)) cout << 2 << " ";
                    else if(i == 1 || j == 1 || i == n || j == m) cout << 3 << " ";
                    else cout << 4 << " ";
                }
                cout << endl;
            }
        }
        else
            cout << "NO" << endl;
    }
}

你可能感兴趣的:(贪心,codeforces)