殘缺的棋盤(dijkstra演算法)
阿新 • • 發佈:2019-02-06
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;
}