1. 程式人生 > >殘缺的棋盤(dijkstra演算法)

殘缺的棋盤(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; }