残缺的棋盘(dijkstra算法)_湖南省赛

Input
输入包含不超过10000 组数据。每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同。

Output
对于每组数据,输出测试点编号和最少步数。

Sample Input
1 1 8 7 5 6
1 1 3 3 2 2
Sample Output
Case 1: 7
Case 2: 3

分析:dijkstra算法

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e6+5;
#define mem(a,n) memset(a,n,sizeof(a))
int r1,r2,r3,c1,c2,c3;
int dxy[8][2]= {-1,0,0,-1,1,0,0,1,-1,-1,-1,1,1,-1,1,1};
int vis[10][10];
struct Node
{
    int x,y,cnt;
} que[N];
bool in(int x,int y)
{
    if(x>0&&x<=8&&y>0&&y<=8)
        return true;
    return false;
}
int bfs()
{
    Node now,next;
    int front=1,rear=1;
    now.x=r1,now.y=c1;
    vis[r1][c1]=1;
    now.cnt=0;
    que[front]=now;
    while(front<=rear)
    {
        Node tou=que[front];
        front++;
        if(tou.x==r2&&tou.y==c2)
            return tou.cnt;
        for(int i=0; i<8; i++)
        {
            int nx=tou.x+dxy[i][0];
            int ny=tou.y+dxy[i][1];
            if(in(nx,ny)&&!vis[nx][ny])
            {
                next.x=nx;
                next.y=ny;
                next.cnt=tou.cnt+1;
                vis[nx][ny]=1;
                rear++;
                que[rear]=next;
            }
        }
    }
}
int main()
{
    int cas=1;
    while(~scanf("%d%d%d%d%d%d",&r1,&c1,&r2,&c2,&r3,&c3))
    {
        mem(vis,0);
        vis[r3][c3]=1;
        int ans=bfs();
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}