Description
Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In order to pass through safely, the Knights have demanded that she bring them a single shrubbery. Time is of the essence, and Bessie must find and bring them a shrubbery as quickly as possible. Bessie has a map of of the forest, which is partitioned into a square grid arrayed in the usual manner, with axes parallel to the X and Y axes. The map is W x H units in size (1 <= W <= 1000; 1 <= H <= 1000). The map shows where Bessie starts her quest, the single square where the Knights of Ni are, and the locations of all the shrubberies of the land. It also shows which areas of the map can be traverse (some grid blocks are impassable because of swamps, cliffs, and killer rabbits). Bessie can not pass through the Knights of Ni square without a shrubbery. In order to make sure that she follows the map correctly, Bessie can only move in four directions: North, East, South, or West (i.e., NOT diagonally). She requires one day to complete a traversal from one grid block to a neighboring grid block. It is guaranteed that Bessie will be able to obtain a shrubbery and then deliver it to the Knights of Ni. Determine the quickest way for her to do so.
Input
Output
Sample Input
4 1 0 0 0 0 1 0
0 0 0 1 0 1 0 0
0 2 1 1 3 0 4 0
0 0 0 4 1 1 1 0
INPUT DETAILS:
Width=8, height=4. Bessie starts on the third row, only a few squares away
from the Knights.
Sample Output
HINT
这片森林的长为8,宽为4.贝茜的起始位置在第3行,离骑士们不远.
贝茜可以按这样的路线完成骑士的任务:北,西,北,南,东,东,北,东,东,南,南.她在森林的西北角得到一株她需要的灌木,然后绕过障碍把它交给在东南方的骑士.
题意是从“2”到“3”途径至少一个“4”,而“1”是路障不能走。第一眼看上去像网络流……但是一看到n、m1000的范围……
后来想了一下发现我逗比了……只要从起点搜一遍、从终点搜一遍,求到每一个点的距离,然后枚举中途的“4”,取距离最小就可以了
wa了一次……因为没用正确的姿势开数组……
#include<cstdio> #include<cstring> struct target{ int x,y; }t[1000001]; struct queue{ int x,y; }q[1000001]; const int mx[4]={0,1,0,-1}; const int my[4]={1,0,-1,0}; int n,m,cnt,x1,y1,x2,y2,head,tail,ans=100000000; int map[1001][1001]; int dis1[1001][1001]; int dis2[1001][1001]; bool mrk[1001][1001]; inline int min(int a,int b) {return a<b?a:b;} inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void bfs1(int x,int y) { head=0;tail=1;mrk[x][y]=1; q[1].x=x;q[1].y=y; while (head<tail) { int nx=q[++head].x,ny=q[head].y; for (int k=0;k<4;k++) { int xx=nx+mx[k],yy=ny+my[k]; if (xx<1||xx>n||yy<1||yy>m)continue; if (mrk[xx][yy]||map[xx][yy]==1) continue; dis1[xx][yy]=dis1[nx][ny]+1; q[++tail].x=xx;q[tail].y=yy; mrk[xx][yy]=1; } } } inline void bfs2(int x,int y) { memset(q,0,sizeof(q)); memset(mrk,0,sizeof(mrk)); head=0;tail=1;mrk[x][y]=1; q[1].x=x;q[1].y=y; while (head<tail) { int nx=q[++head].x,ny=q[head].y; for (int k=0;k<4;k++) { int xx=nx+mx[k],yy=ny+my[k]; if (xx<1||xx>n||yy<1||yy>m)continue; if (mrk[xx][yy]||map[xx][yy]==1) continue; dis2[xx][yy]=dis2[nx][ny]+1; q[++tail].x=xx;q[tail].y=yy; mrk[xx][yy]=1; } } } int main() { m=read();n=read(); for (int i=1;i<=n;i++) for(int j=1;j<=m;j++) { map[i][j]=read(); if (map[i][j]==4) { t[++cnt].x=i; t[cnt].y=j; }else if (map[i][j]==2) { x1=i; y1=j; map[i][j]=0; }else if (map[i][j]==3) { x2=i; y2=j; map[i][j]=0; } } bfs1(x1,y1); bfs2(x2,y2); for (int i=1;i<=cnt;i++) { int nx=t[i].x,ny=t[i].y; if (!(dis1[nx][ny]+dis2[nx][ny]))continue; ans=min(ans,dis1[nx][ny]+dis2[nx][ny]); } printf("%d",ans); }