Bomb dropping algorithm

后端 未结 30 1389
挽巷
挽巷 2021-01-29 16:55

I have an n x m matrix consisting of non-negative integers. For example:

2 3 4 7 1
1 5 2 6 2
4 3 4 2 1
2 1 2 4 1
3 1 3 4 1
2 1 4 3 2
6 9 1 6 4
         


        
30条回答
  •  死守一世寂寞
    2021-01-29 17:39

    This greedy solution seems to be correct:

    As pointed in comments, it'll fail in 2D. But maybe you may improve it.

    For 1D:
    If there is at least 2 numbers you don't need to shoot to the leftmost one because shooting to the second is not worse. So shoot to the second, while first isn't 0, because you have to do it. Move to the next cell. Don't forget about last cell.

    C++ code:

    void bombs(vector& v, int i, int n){
        ans += n;
        v[i] -= n;
        if(i > 0)
            v[i - 1] -= n;
        if(i + 1< v.size())
            v[i + 1] -= n;
    }
    
    void solve(vector v){
        int n = v.size();
        for(int i = 0; i < n;++i){
            if(i != n - 1){
                bombs(v, i + 1, v[i]);
            }
            else
                bombs(v, i, v[i])
        }
    }
    

    So for 2D:
    Again: you don't need to shoot in the first row (if there is the second). So shoot to the second one. Solve 1D task for first row. (because you need to make it null). Go down. Don't forget last row.

提交回复
热议问题