题目链接:点击打开链接
题意:
一个n*n棋盘,有一只马,马能走8个方向,问是否能从点st,到达点ed。
写法:
水题,bfs。
总结:
在我的专题训练小结里点击打开链接
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <cstdlib> using namespace std; struct node { int x, y, cost; node(int x, int y, int cost):x(x), y(y), cost(cost){} }; bool vis[300+5][300+5]; int n, T; node st(0, 0, 0), ed(0, 0, 0); const int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1}; const int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2}; inline bool check(int x, int y){ return (0<=x && x<n && 0<=y && y<n && !vis[x][y]); } int bfs(){ queue<node> q; st.cost = 0; q.push(st); memset(vis, 0, sizeof(vis)); vis[st.x][st.y] = true; while(!q.empty()){ node tmp = q.front(); q.pop(); if(tmp.x==ed.x && tmp.y==ed.y) return tmp.cost; for(int i=0; i<8; ++i){ int tx = dx[i] + tmp.x; int ty = dy[i] + tmp.y; int tc = tmp.cost + 1; if(check(tx, ty)){ q.push(node(tx, ty, tc)); vis[tx][ty] = true; } } } } int main(){ scanf("%d", &T); while(T--){ scanf("%d%d%d%d%d", &n, &st.x, &st.y, &ed.x, &ed.y); printf("%d\n", bfs()); } return 0; }