题解 | #棋盘#
棋盘
https://www.nowcoder.com/practice/aa1710fef87a43e390fde7f236452df3
#include <iostream> #include <vector> #include <algorithm> const long mod = 100007; using namespace std; vector<vector<long long>> mem; long long cnt = 0; long long mem_track(vector<vector<int>>& a,vector<vector<int>>& b,int endx,int endy,vector<vector<bool>>& vis){ if(vis[endx][endy]) return mem[endx][endy]; vis[endx][endy] = true; mem[endx][endy] = 1; if(endx - 1 >= 0 && a[endx-1][endy] + b[endx-1][endy] <= a[endx][endy]) {mem[endx][endy] += mem_track(a,b,endx-1,endy,vis); mem[endx][endy] %= mod;} if(endx + 1 < a.size() && a[endx+1][endy] + b[endx+1][endy] <= a[endx][endy]) {mem[endx][endy] += mem_track(a,b,endx+1,endy,vis); mem[endx][endy] %= mod;} if(endy - 1 >= 0 && a[endx][endy-1] + b[endx][endy-1] <= a[endx][endy]) {mem[endx][endy] += mem_track(a,b,endx,endy-1,vis); mem[endx][endy] %= mod;} if(endy + 1 < a[0].size() && a[endx][endy+1] + b[endx][endy+1] <= a[endx][endy]) {mem[endx][endy] += mem_track(a,b,endx,endy+1,vis); mem[endx][endy] %= mod;} return mem[endx][endy]; } int main(){ int n = 0, m = 0; cin >> n >> m; vector<vector<int>> a(n,vector<int>(m)); vector<vector<int>> b(n,vector<int>(m)); mem.resize(n,vector<long long>(m)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> a[i][j]; } } for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> b[i][j]; } } int q = 0; cin >> q; vector<vector<bool>> vis(n,vector<bool>(m,false)); while(q--){ int x ,y; cin >> x >> y; cout << mem_track(a,b,x-1,y-1,vis) << endl; } return 0; }