题意
给出 n ∗ m n*m n∗m的矩形,求出骑士从 ( 1 , 1 ) (1,1) (1,1)走到 ( n , m ) (n,m) (n,m)的最短路径的条数。
思路
搜索即可。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int dx[] = {1, 1, 2, 2, -1, -1, -2, -2}, dy[] = {2, -2, 1, -1, 2, -2, 1, -1};
int n, m, ans;
int g[101][101], v[101][101];
int check(int x, int y) {
return x > 0 && x <= n && y > 0 && y <= m;
}
void bfs() {
std::queue<std::pair<int, int> > q;
q.push(std::make_pair(1, 1));
g[1][1] = 1;
while (q.size()) {
int x = q.front().first, y = q.front().second;
q.pop();
int xx, yy;
for (int i = 0; i < 8; i++) {
xx = x + dx[i];
yy = y + dy[i];
if (!check(xx, yy) || v[xx][yy] && v[xx][yy] <= v[x][y]) continue;
g[xx][yy] = (g[xx][yy] + g[x][y]) % 9901;
if (v[xx][yy] != v[x][y] + 1) q.push(std::make_pair(xx, yy));
v[xx][yy] = v[x][y] + 1;
}
}
}
int main() {
scanf("%d %d", &n, &m);
bfs();
printf("%d", g[n][m]);
}