在国际象棋里,王是最重要的一个棋子。每一步,王可以往上下左右或者对角线方向移动一步,如下图所示。
给定两个格子A(r1,c1), B(r2,c2),你的任务是计算出一个王从A到B至少需要走多少步。为了避免题目太简单,我们从棋盘里拿掉了一个格子C(r3,c3)(ABC保证互不相同),要求王从A走到B的过程中不能进入格子C。在本题中,各行从上到下编号为1~8,各列从左到右编号为1~8。
Input
Output
Sample Input
1 1 8 7 5 6
1 1 3 3 2 2
Sample Output
Case 1: 7
Case 2: 3
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include <queue>
using namespace std;
const int N = 10;
int r1, c1, r2, c2, r3, c3, k = 1;
bool vis[N][N];
int step[N][N];
typedef pair<int, int> Pii;
void bfs()
{
printf("Case %d: ", k++);
queue<Pii> que;
vis[r1][c1] = vis[r3][c3] = true;
memset(step, 0, sizeof(step));
que.push(Pii(r1,c1));
while(!que.empty())
{
Pii p = que.front();
que.pop();
if(p.first == r2 && p.second == c2)
{
printf("%d\n", step[p.first][p.second]);
}
for(int i = -1; i<=1; i++)
{
for(int j = -1; j<=1; j++)
{
int tx = p.first + i;
int ty = p.second + j;
if(!vis[tx][ty]&&tx>=1&&tx<=8&&ty>=1&&ty<=8)
{
que.push(Pii(tx, ty));
step[tx][ty]=step[p.first][p.second] + 1;
}
vis[tx][ty] = true;
}
}
}
}
int main()
{
while(~scanf("%d %d %d %d %d %d", &r1, &c1, &r2, &c2, &r3, &c3))
{
memset(vis, false , sizeof(vis));
bfs();
}
return 0;
}