做这个题是根据矩形的最大面积链接过来的,本来以为是用动态规划来做,进来以后感觉这题也不是动态规划,只好参考评论区大神进行模拟,恕我自己太菜。
正向从空画板到现在的画板不好做,进行逆向,从现有画板返回到空画板进行操作,如果当前这个点为B,则从当前点向右下角的对角线去找是否还有B,有的话进行更改,如果发现有G的话,减去一次B,改为Y,按道理不应该有Y,如果有Y的话直接退出。
同理,如果当前点是Y的话,向左下角去寻找,更新方法,同上述一样。
循环遍历所有数组,每一次进入一次更改,结果值+1,

#include<iostream>
#include<vector>
using namespace std;
void helper(vector<vector<char>>& map,const int& n,const int& m,int x,int y){
    if(map[x][y] == 'Y'){
        while(x < n && y < m){
            if(map[x][y] == 'Y') map[x][y] = 'X';
            else if(map[x][y] == 'G') map[x][y] = 'B';
            else break;
            x++;
            y++;
        }
    }else{
         while(x < n && y >= 0){
            if(map[x][y] == 'B') map[x][y] = 'X';
            else if(map[x][y] == 'G') map[x][y] = 'Y';
            else break;
            x++;
            y--;
        }
    }
    return;
}
int main(){
    int n=0,m = 0;
    cin >> n >> m;
    if(n == 0 || m == 0){
        cout << 0 << endl;
        return 0;
    }
    vector<vector<char>> map(n,vector<char>(m));
    for(int i = 0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> map[i][j];
        }
    }
    if(map.size() != n || map[0].size() != m){
        cout << 0 << endl;
        return 0;
    }
    int res = 0;
    for(int i=0;i<n;i++){
        for(int j = 0;j<m;j++){
            if(map[i][j] == 'X') continue;
            if(map[i][j] == 'Y' || map[i][j] == 'B'){
                res ++;
                helper(map,n,m,i,j);
            }else if(map[i][j] == 'G'){
                res ++;
                map[i][j] = 'Y';
                helper(map,n,m,i,j);
                res++;
                map[i][j] = 'B';
                helper(map,n,m,i,j);
            }
        }
    }
    cout << res << endl;
    return 0;
}