2014-9-27NOIP模擬賽
1、柵欄迷宮
田野上搭建了一個黃金大神專用的柵欄圍成的迷宮。幸運的是,在迷宮的邊界上留出了兩段柵欄作為迷宮的出口。更幸運的是,所建造的迷宮是一個“完美的”迷宮:即你能從迷宮中的任意一點找到一條走出迷宮的路。給定迷宮的寬W(1<=W<=38)及長H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面給出的格式表示一個迷宮。然後計算從迷宮中最“糟糕”的那一個點走出迷宮所需的步數(就是從最“糟糕”的一點,走出迷宮的最少步數)。(即使從這一點以最優的方式走向最靠近的出口,它仍然需要最多的步數)當然了,黃金大神讓你必須只會水平或垂直地在X或Y軸上移動,你不能從來不走對角線。每移動到一個新的方格算作一步(包括移出迷宮的那一步)這是一個W=5,H=3的迷宮:
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
如上圖的例子,柵欄的柱子只出現在奇數行或奇數列。每個迷宮只有兩個出口。
PROGRAM NAME: maze
INPUT FORMAT:
(file maze.in)
第一行: W和H(用空格隔開)
第二行至第2*H+1行: 每行2*W+1個字符表示迷宮
OUTPUT FORMAT:
(file maze.out)
輸出一個單獨的整數,表示能保證牛從迷宮中任意一點走出迷宮的最小步數。
SAMPLE INPUT
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
SAMPLE OUTPUT
9
善良的學長:樣例輸入可以復制進記事本或者文本文檔這樣看起來更加直觀!!!=v=
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 210 using namespace100分 bfsstd; char ch[maxn]; int map[maxn][maxn],n,m,dis[maxn][maxn],ans; bool vis[maxn][maxn]; int e[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct node{ int x,y,step; }cur,nxt; queue<node>q; void bfs(){ while(!q.empty()){ cur=q.front(); q.pop(); vis[cur.x][cur.y]=0; int x=cur.x,y=cur.y,xx,yy; for(int i=0;i<4;i++){ xx=x+e[i][0]; yy=y+e[i][1]; if(xx<=n&&xx>=1&&yy<=m&&yy>1&&!vis[xx][yy]&&!map[xx][yy]){ nxt.x=xx;nxt.y=yy;nxt.step=cur.step+1; if(dis[xx][yy]>nxt.step){ dis[xx][yy]=nxt.step; q.push(nxt); vis[xx][yy]=1; } } } } } int main(){ //freopen("Cola.txt","r",stdin); freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); memset(dis,127/3,sizeof(dis)); scanf("%d%d",&m,&n); m=m*2+1;n=n*2+1; getchar(); for(int i=1;i<=n;i++){//第i行 gets(ch+1); for(int j=1;j<=m;j++){ if(ch[j]!=‘ ‘)map[i][j]=1; if(ch[j]==‘ ‘){ if(i==1||i==n||j==1||j==m){ cur.x=i;cur.y=j;cur.step=0; dis[cur.x][cur.y]=0; q.push(cur); vis[cur.x][cur.y]=1; } } } } bfs(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!map[i][j]) ans=max(ans,dis[i][j]); } } printf("%d",(ans+1)/2); return 0; }
2、人偶師(alice.cpp/c/pas)
【題目描述】
n點m雙向邊的圖,每個點有2個狀態:開和關。每次操作改變一個點的狀態,以及與其有邊直接相連的點的狀態。問開啟所有點至少需要多少次操作。
【輸入格式】
第一行2個整數n,m。
第二行n個整數,第i個數表示第i點的狀態,0為關,1為開。
第3..m+2行,每行2個整數a,b,表示a和b直接相連,同一條邊不會出現多次。
【輸出格式】
第一行一個整數k表示最少的操作次數,所有數據保證至少有一組可行解。
第二行k個整數,表示操作的點的編號。
【樣例輸入】
4 3
1 1 0 0
2 3
1 3
2 4
【樣例輸出】
3
1 2 3
【數據範圍】
對於30%的數據,1<=n<=10,0<=m<=40
對於60%的數據,1<=n<=30,0<=m<=100
對於100%的數據,1<=n<=40,0<=m<=500
善良的學長:雖然解可能不只一個,但是你只要輸出任意一個即可得分0.0
3、交通(traffic.c/cpp/pas)
黃金大神國的首都位於hzwer河中的一座島嶼。一道上班的時候,成千上萬輛汽車通過島嶼從西岸的住宅區(由橋連接島的西部)到東岸的工業區(由橋連接島的東部)。
該島類似於矩形,它的邊平行於主方向。故可將它看作是笛卡爾坐標系中的一個A*B的矩形,它的對角分別為(0, 0)和(A, B)。
島上有n個交通節點(後宮建築),編號為1…n,第i個節點坐標為(xi, yi)。如果一個節點的坐標為(0, y),它就位於島的西岸。類似的,坐標為(A, y)的節點位於島的東岸。各個節點由街道連接,每條街道用線段連接兩個節點。街道有單向行駛或雙向行駛之分。除端點外任意兩條街道都沒有公共點。也沒有橋梁或者隧道。
你不能對道路網絡形狀做任何其他假設。沿河岸的街道或節點可能沒有入口或者出口街道。由於交通堵塞日趨嚴重,黃金大神想快速治理好他的國家,於是聘請你測試島上當前的道路網是否足夠。要求你寫一個程序確定從島的西岸的每個節點能夠到達東岸的多少個節點。
【輸入格式】
第1行包含4個整數n, m, A, B,分別表示hzwer市中心的節點數,街道數和島嶼的尺寸。
接下來的n行,每行包含兩個整數xi,yi (0≤xi≤A,0≤yi≤B),表示第i個節點的坐標。任意兩個節點的坐標都不相同。
再往下的m行表示街道,每條街道用3個整數ci, di, ki(1≤ci, di≤n, ci≠di, ki∈{1,2}),表示節點ci、di有街道連接,如果ki=1,表示從ci到di的街道是單向的,否則,這條街道可以雙向行駛。每個無序對{ci, di}最多出現1次。
你可以假設西岸節點中至少有1個能夠到達東岸的一些節點。
【輸出格式】
為每個西岸節點輸出1行,表示這個節點出發能夠到達東岸的節點數目
【樣例輸入】
12 13 7 9
0 1
0 3
2 2
5 2
7 1
7 4
7 6
7 7
3 5
0 5
0 9
3 9
1 3 2
3 2 1
3 4 1
4 5 1
5 6 1
9 3 1
9 4 1
9 7 1
9 12 2
10 9 1
11 12 1
12 8 1
12 10 1
【樣例輸出】
4
4
0
2
【數據範圍】
對於30%的數據,n, m≤6000
對於100%的數據,1≤n≤300000, 0≤m≤900000,1≤A,B≤10^9
2014-9-27NOIP模擬賽