sicily 1781 Knight

Description

Your task is to write a program to calculate the minimum number of moves needed for a knight to reach one point from another. The possible knight moves are shown in Figure 1.


Figure 1  Possible knight moves on the board

Input

The first line contains an integer T (≤10), indicating the number of test cases.

In every case, the first line contains an integer N (≤500), indicating the size of the chess board (the entire board has size N  × N). The second and third line contain pair of integers (srcR, srcC), and (dstR, dstC), specifying the starting and ending position of the knight on the board (0 ≤ srcR, srcC, dstR, dstC ≤ N – 1).

Output

For every case, output the minimum distance on a single line. If starting point and ending point are equal, distance is 0. If the knight can’t reach the ending point, distance is -1.

Sample Input

2
1
0 0
0 0
10
0 1
8 9

Sample Output

0
6

分析:

简单的BFS查找,注意判断状态是否合法即可。

代码:

 1 // Problem#: 1781
 2 // Submission#: 1896080
 3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
 4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
 5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
 6 #include <iostream>
 7 #include <queue>
 8 #include <cstring>
 9 using namespace std;
10 
11 #define MAX 500
12 
13 struct node{
14     int x, y, z;
15     node(int r, int s, int t){
16         x = r;
17         y = s;
18         z = t;
19     }
20 };
21 
22 int n, a, b, c, d;
23 bool visit[MAX][MAX];
24 int move[8][2] = {{-2, -1}, {-1, -2}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {1, -2}, {2, -1}};
25 
26 inline bool judge(int x, int y){
27     return x >= 0 && x < n && y >= 0 && y < n;
28 }
29 
30 int bfs(){
31     queue<node> buffer;
32     memset(visit, false, sizeof(visit));
33     buffer.push(node(a, b, 0));
34     visit[a][b] = true;
35     while (!buffer.empty()) {
36         node tmp = buffer.front();
37         if (tmp.x == c && tmp.y == d) 
38             return tmp.z;
39         buffer.pop();
40         for (int i = 0 ; i < 8 ; ++i) {
41             int tx = tmp.x + move[i][0];
42             int ty = tmp.y + move[i][1];
43             int tz = tmp.z + 1;
44             if (judge(tx, ty) && !visit[tx][ty]){
45                 buffer.push(node(tx, ty, tz));
46                 visit[tx][ty] = true;
47             }
48         }
49     }
50     return -1;
51 }
52 
53 int main() {
54     int t;
55     cin >> t;
56     while (t--) {
57         cin >> n;
58         cin >> a >> b >> c >> d;
59         cout << bfs() << endl;
60     }
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/ciel/archive/2013/01/25/2876827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值