NOIP2012 普及組 尋寶

題目描述  Description

傳說很遙遠的藏寶樓頂層藏着誘人的寶藏。小明歷盡千辛萬苦終於找到傳說中的這個藏寶樓,藏寶樓的門口豎着一個木板,上面寫有幾個大字:尋寶說明書。說明書的內容以下:字體

藏寶樓共有N+1層,最上面一層是頂層,頂層有一個房間裏面藏着寶藏。除了頂層外,藏寶樓另有N層,每層M個房間,這M個房間圍成一圈並按逆時針方向依次編號爲0,…,M-1。其中一些房間有通往上一層的樓梯,每層樓的樓梯設計可能不一樣。每一個房間裏有一個指示牌,指示牌上有一個數字x,表示從這個房間開始按逆時針方向選擇第x個有樓梯的房間(假定該房間的編號爲k),從該房間上樓,上樓後到達上一層的k號房間。好比當前房間的指示牌上寫着2,則按逆時針方向開始嘗試,找到第2個有樓梯的房間,從該房間上樓。若是當前房間自己就有樓梯通向上層,該房間做爲第一個有樓梯的房間。spa

    尋寶說明書的最後用紅色大號字體寫着:「尋寶須知:幫助你找到每層上樓房間的指示牌上的數字(即每層第一個進入的房間內指示牌上的數字)總和爲打開寶箱的密鑰」。設計

請幫助小明算出這個打開寶箱的密鑰。code

輸入描述  Input Description

第一行2個整數N和M,之間用一個空格隔開。N表示除了頂層外藏寶樓共N層樓,M表示除頂層外每層樓有M個房間。blog

接下來N*M行,每行兩個整數,之間用一個空格隔開,每行描述一個房間內的狀況,其中第(i-1)*M+j行表示第i層j-1號房間的狀況(i=1,2,…, N;j=1,2,…,M)。第一個整數表示該房間是否有樓梯通往上一層(0表示沒有,1表示有),第二個整數表示指示牌上的數字。注意,從j號房間的樓梯爬到上一層到達的房間必定也是j號房間。ip

最後一行,一個整數,表示小明從藏寶樓底層的幾號房間進入開始尋寶(注:房間編號從0開始)。io

輸出描述  Output Description

輸出只有一行,一個整數,表示打開寶箱的密鑰,這個數可能會很大,請輸出對20123取模的結果便可。class

樣例輸入  Sample Input

2 3統計

1 2數據

0 3

1 4

0 1

1 5

1 2

1

樣例輸出  Sample Output

5

 

數據範圍及提示  Data Size & Hint

【輸入輸出樣例說明】

第一層:

0號房間,有樓梯通往上層,指示牌上的數字是2;

1號房間,無樓梯通往上層,指示牌上的數字是3;

2號房間,有樓梯通往上層,指示牌上的數字是4;

第二層:

0號房間,無樓梯通往上層,指示牌上的數字是1;

1號房間,有樓梯通往上層,指示牌上的數字是5;

2號房間,有樓梯通往上層,指示牌上的數字是2;

小明首先進入第一層(底層)的1號房間,記下指示牌上的數字爲3,而後從這個房間開始,沿逆時針方向選擇第3個有樓梯的房間2號房間進入,上樓後到達第二層的2號房間,記下指示牌上的數字爲2,因爲當前房間自己有樓梯通向上層,該房間做爲第一個有樓梯的房間。所以,此時沿逆時針方向選擇第2個有樓梯的房間即爲1號房間,進入後上樓梯到達頂層。這時把上述記下的指示牌上的數字加起來,即3+2=5,因此打開寶箱的密鑰就是5。

【數據範圍】

對於50%數據,有0<N≤1000,0<x≤10000;

對於100%數據,有0<N≤10000,0<M≤100,0<x≤1,000,000。

題目分析

本題純粹模擬,基本沒有太多須要跳過的坑。能夠統計每一層樓裏面,有樓梯的房間數,避免在某一層樓繞不少圈。具體看下面的代碼註釋吧

 1 #include <stdio.h>
 2 struct room 
 3 {
 4     int haveStairs;//描述房間是否有上樓的樓梯。0:沒有;1:有。
 5     int x;//房間裏面指示牌上的數字。 
 6 };
 7 int N,M,Y;//Y表示第1層從Y號房間進入。 
 8 struct room a[10002][102];
 9 int count[100002]={0};//count[i]表示第i層有樓梯的房間數量 
10 int ans=0;
11 int main()
12 {
13     int i,j,t,k;
14 
15     scanf("%d%d",&N,&M);
16     for(i=0;i<N;i++)
17     {
18         for(j=0;j<M;j++)
19         {
20             scanf("%d%d",&a[i][j].haveStairs,&a[i][j].x); 
21             count[i]+=a[i][j].haveStairs;
22         }
23     }
24     scanf("%d",&Y);
25     
26     for(i=0;i<N;i++)
27     {
28         t=a[i][Y].x;
29         ans=(ans+t)%20123;
30         t=t%count[i];
31         if(t==0) t=count[i];
32         
33         k=Y;
34         do
35         {
36             if(a[i][k].haveStairs==1) t--;
37             k++;
38             k=k%M;
39         }while(t);
40         k--;
41         if(k==-1) k=M-1;
42         Y=k;
43     }
44     printf("%d\n",ans);
45     return 0;
46 }
相關文章
相關標籤/搜索