题解 | #棋盘#

棋盘

https://www.nowcoder.com/practice/aa1710fef87a43e390fde7f236452df3

方法:逆向思维+BFS/DFS

逆向思维:从终点逆向出发。由于正向的a_next >=a_now+b_now,则逆向表示a_now>=a_next+b_next,所以从重点出发进行搜索,每次找到一个满足条件的点就需要更新答案。

搜索(以BFS为例):经典bfs,queue

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 10;
const int MOD = 1e5 + 7;

int n, m;
int a[MAXN][MAXN];
int b[MAXN][MAXN];
int next_x[4] = {-1, 0, 1, 0};
int next_y[4] = {0, 1, 0, -1};

int bfs(int x, int y) {
    int ret = 1;
    queue<pair<int, int> >q;
    while (!q.empty())q.pop(); //make it clear

    q.push(pair<int, int>(x, y)); //the first point
    while (!q.empty()) {
        pair<int, int>now = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i) {
            int midx = now.first + next_x[i];
            int midy = now.second + next_y[i];
            if (midx < 1 || midx > n || midy < 1 || midy > m)continue;
            if (a[now.first][now.second] >= a[midx][midy] + b[midx][midy] ) {
//                cout<<"in"<<endl;
                ret = (ret+1)%MOD;
                q.push(pair<int, int>(midx, midy));
            }
//            printf("%d %d %d\n",midx,midy,ret);
        }
    }
    return ret;
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            scanf("%d", &a[i][j]);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            scanf("%d", &b[i][j]);
    int _;
    scanf("%d", &_);
    while (_--) {
        int x, y;
        scanf("%d%d", &x, &y);
        printf("%d\n", bfs(x, y));
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务