题解 | #棋盘#
棋盘
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")