日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河

發布時間:2025/7/14 编程问答 112 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

傳說中教主乃世外高人,不屑于參加OI競賽,于是云游四方,威風八面。只不過教主行蹤不定,就像傳說中的神獸一樣可遇而不可求。小L和小H為了求得教主簽名的Orz教主T-Shirt,打算碰碰運氣展開了冒險。在冒險中,他們不幸被突來的洪水沖到了一個神秘叢林中,他們想盡快逃出這個地方。小L找到了一張看似為曾經的冒險者遺棄的地圖,但經過探查,地圖所示的確實是這片叢林。小L從地圖上看到,有眾多河流穿過這片叢林,等到他接近一條最近的河流時,發現水流較急,且河水很深,小H不擅長游泳,所以他們決定利用叢林中的樹木做一只竹筏渡河。
  雖然竹筏做好后可以在這一條河所連通的水域任意行進,但是竹筏在上岸后必須拋棄,若想再次渡河必須再做一次竹筏,但這畢竟是十分辛苦的,他們希望做竹筏也就是渡河的次數盡量少,就求助于你。
  地圖上的陸地和河流可以抽象沖一個n*n由數字0和1組成的矩陣,其中0代表陸地,1代表河流。無論在陸地上還還是河流上,他們都可以向相鄰8格(邊相鄰或角相鄰)移動,但是若要從陸地進入河流(也就是從0到1),則必須制作竹筏。若到達地圖邊界則順利逃脫。但是小T和小K有可能迷路,所以會多次詢問你,對于每次詢問,只要輸出到達地圖邊界需要的最少渡河次數即可,保證每次詢問都是指向陸地。
  小L和小H翻到地圖的反面,赫然發現六個大字:“教主到此一游”!兩人無法抑制自己激動的心情,將這張地圖珍藏起來。據說后來這張圖成為無價之寶。

Input

第1行包括2個正整數N,K,分別描述了地圖的長寬以及詢問的次數。
  下面N行,每行N個數字0或者1,數字之間沒有空格,描述了這張地圖。
  接下來K行,每行2個正整數xi,yi,詢問在第xi行第yi列最少需要渡河幾次。

Output

輸出僅包括1行,按輸入順序每行對于一個詢問輸出最少需要渡河的次數,數字間用空格隔開,行末換行并沒有空格。

Sample Input

9 3
000000000
011111110
010101010
011000110
010000010
010111010
010101010
011111110
000000000
1 3
3 3
4 6

Sample Output

0 1 1

Data Constraint

Hint

【樣例說明】
  第1次詢問由于已經處于邊界所以答案為0。
  第2次詢問不斷向左或向上走都只要渡河1次。
  第3次詢問不斷向四個方向中的一個方向走同樣只需要1次渡河。

【數據規?!?br />   對于20%的數據,有n≤10;
  對于40%的數據,有n≤100,k≤10;
  對于60%的數據,有n≤1000,k≤100;
  對于100%的數據,有n≤1000,k≤40000。

題解:
本題一看就是用預處理的方法去做。
看看題意,才發現走到邊界就可以逃離。那么,就直接把邊界各個點的花費改成0,若是邊界是水,就改成1.然后在尋找每個點,尋找這個點的八個方向。若是這個點是陸地,那么找這個點八方的水的花費,若是這個點是水路,那么就找這個點的八方的陸地花費。然后就把這個點可以連到且數字一樣的數都改成這個花費,于是就對了。
標程:

typenew=recordx:longint;y:longint;z:longint;end; vari,j,k,l,n,m,head,tail,took,x,y,cs:longint;a:array[1..1000000] of new;map,land,river:array[1..1000,1..1000] of longint;bz:array[1..1000,1..1000] of boolean;fx:array[1..8,1..2] of longint=((-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1));s:ansistring; procedure riverbfs(dep:longint); vari,j,k,l,nx,ny:longint; beginfor i:=1 to 8 dobeginnx:=a[dep].x+fx[i,1];ny:=a[dep].y+fx[i,2];if(nx>0)and(nx<=n)and(ny>0)and(ny<=n) thenbeginif (bz[nx,ny])and(map[nx,ny]=1) thenbegininc(took);a[took].x:=nx;a[took].y:=ny;bz[nx,ny]:=false;river[nx,ny]:=cs;end;end;end; end; procedure landbfs(dep:longint); vari,j,k,l,nx,ny:longint; beginfor i:=1 to 8 dobeginnx:=a[dep].x+fx[i,1];ny:=a[dep].y+fx[i,2];if(nx>0)and(nx<=n)and(ny>0)and(ny<=n) thenbeginif (bz[nx,ny])and(map[nx,ny]=0) thenbegininc(took);a[took].x:=nx;a[took].y:=ny;bz[nx,ny]:=false;land[nx,ny]:=cs;end;end;end; end; begin//assign(input,'cross_the_river.in');reset(input);readln(n,m);fillchar(bz,sizeof(bz),true);for i:=1 to n dobeginreadln(s);for j:=1 to n dobeginif s[j]='1' then inc(map[i,j]);end;end;for i:=1 to n dobeginif map[1,i]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=1;a[1].y:=i;land[1,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[n,i]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=n;a[1].y:=i;land[n,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[i,1]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=1;land[i,1]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[i,n]=0 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=n;land[i,n]:=cs;bz[i,1]:=false;repeatfor j:=head to tail dolandbfs(j);head:=tail+1;tail:=took;until head>tail;end;end;cs:=1;for i:=1 to n dobeginif map[1,i]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=1;a[1].y:=i;river[1,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[n,i]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=n;a[1].y:=i;river[n,i]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[i,1]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=1;river[i,1]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;if map[i,n]=1 thenbeginhead:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=n;river[i,n]:=cs;bz[i,1]:=false;repeatfor j:=head to tail doriverbfs(j);head:=tail+1;tail:=took;until head>tail;end;end;cs:=0;for i:=2 to n-1 dobeginfor j:=2 to n-1 dobeginif bz[i,j] thenbeginif map[i,j]=0 thenbeginfor k:=1 to 8 dobeginx:=i+fx[k,1];y:=j+fx[k,2];if river[x,y]>0 then cs:=river[x,y]else if (river[x,y]<cs)and(river[x,y]>0) then cs:=river[x,y];end;head:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=j;land[i,j]:=cs;bz[i,j]:=false;repeatfor k:=head to tail dolandbfs(k);head:=tail+1;tail:=took;until head>tail;endelsebeginfor k:=1 to 8 dobeginx:=i+fx[k,1];y:=j+fx[k,2];if land[x,y]>0 then cs:=land[x,y]else if (land[x,y]<cs)and(land[x,y]>0) then cs:=land[x,y];end;head:=1;tail:=1;took:=1;a[1].x:=i;a[1].y:=j;river[i,j]:=cs+1;inc(cs);bz[i,j]:=false;repeatfor k:=head to tail doriverbfs(k);head:=tail+1;tail:=took;until head>tail;end;end;end;end;for i:=1 to m dobeginreadln(x,y);write(land[x,y],' ');end;writeln; end.

轉載于:https://www.cnblogs.com/RainbowCrown/p/11148431.html

總結

以上是生活随笔為你收集整理的2017.04.15【NOIP2017提高组】模拟赛B组 T2:渡河的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。