NOIP2012-普及組復賽-第二題-尋寶


題目描述 Description
傳說很遙遠的藏寶樓頂層藏着誘人的寶藏。小明歷盡千辛萬苦終於找到傳說中的這個藏寶樓,藏寶樓的門口豎着一個木板,上面寫有幾個大字:尋寶說明書。說明書的內容如下:
藏寶樓共有N+1層,最上面一層是頂層,頂層有一個房間里面藏着寶藏。除了頂層外,藏寶樓另有N層,每層M個房間,這M個房間圍成一圈並按逆時針方向依次編號為0,…,M-1。其中一些房間有通往上一層的樓梯,每層樓的樓梯設計可能不同。每個房間里有一個指示牌,指示牌上有一個數字x,表示從這個房間開始按逆時針方向選擇第x個有樓梯的房間(假定該房間的編號為k),從該房間上樓,上樓后到達上一層的k號房間。比如當前房間的指示牌上寫着2,則按逆時針方向開始嘗試,找到第2個有樓梯的房間,從該房間上樓。如果當前房間本身就有樓梯通向上層,該房間作為第一個有樓梯的房間。
尋寶說明書的最后用紅色大號字體寫着:“尋寶須知:幫助你找到每層上樓房間的指示牌上的數字(即每層第一個進入的房間內指示牌上的數字)總和為打開寶箱的密鑰”。
請幫助小明算出這個打開寶箱的密鑰。
 輸入輸出格式 Input/output
輸入格式:
第一行2個整數N和M,之間用一個空格隔開。N表示除了頂層外藏寶樓共N層樓,M表示除頂層外每層樓有M個房間。
接下來N*M行,每行兩個整數,之間用一個空格隔開,每行描述一個房間內的情況,其中第(i-1)*M+j行表示第i層j-1號房間的情況(i=1,2,…, N;j=1,2,…,M)。第一個整數表示該房間是否有樓梯通往上一層(0表示沒有,1表示有),第二個整數表示指示牌上的數字。注意,從j號房間的樓梯爬到上一層到達的房間一定也是j號房間。
最后一行,一個整數,表示小明從藏寶樓底層的幾號房間進入開始尋寶(注:房間編號從0開始)。
輸出格式:
輸出只有一行,一個整數,表示打開寶箱的密鑰,這個數可能會很大,請輸出對20123取模的結果即可。
 輸入輸出樣例 Sample input/output
樣例測試點#1
輸入樣例:

2 3
1 2
0 3
1 4
0 1
1 5
1 2
1

 輸出樣例:

5

說明 description
【數據范圍】
對於50%數據,有0<N≤1000,0<x≤10000;
對於100%數據,有0<N≤10000,0<M≤100,0<x≤1,000,000
思路:
①題目中給出有N層,每層有M個房間,那么這棟樓就共有N*M個房間
②每個房間都有號碼、樓梯,那么我們可以考慮使用兩個二維數組存儲每個房間的樓梯、號碼(number[房間序號][房間的號碼]、stairs[房間序號][房間的樓梯])
③我們把每一層樓想象成一個圈,我們純模擬一下小明行走的過程就可以了:
首先我們從起點開始,繞着圈走每一層,計數器答案ans要加上,並且每次都要取模(太大會超的),並且要把走過的房間樓梯給覆蓋掉,否則會重復的
代碼如下:
 1 #include<stdio.h>  
 2 #include<stdlib.h>   
 3 int number[10000][200];  
 4 int stairs[10000][200];//處理房間成圈形的樓梯計數    
 5 int quan[10000],lm;//儲存每樓層房間數
 6 int main()  
 7 {  
 8     int n,m,ans=0,xx; 
 9     int lm;
10     int i,ii; 
11     int j,jj;    
12     //freopen("treasure.in","r",stdin);
13     //freopen("treasure.out","w",stdout);
14     scanf("%d%d",&n,&m);       
15     /*===========================================================*/
16     //輸入每層樓是否有樓梯、牌子上的數字(房間的情況) 
17     for(i=0;i<n;i++)  
18     {  
19         for(j=0;j<m;j++)  
20         {  
21             scanf("%d%d",&stairs[i][j],&number[i][j]);  
22             quan[i]+=stairs[i][j];  
23         }  
24     }  
25     /*===========================================================*/
26     scanf("%d",&jj);//小明從第幾號開始爬樓        
27     for(ii=0;ii<n;ii++)  
28     {  
29         ans=ans+number[ii][jj];//答案加上  
30         lm=number[ii][jj];  
31         lm=lm%quan[ii]+quan[ii];//每個圈要取余數(太大會超的) 
32         lm=lm-stairs[ii][jj];//每個圈要減去之前的            
33         while(lm>0)  
34         {   
35             jj++;  
36             jj%=m;   
37             lm=lm-stairs[ii][jj];   
38         }  
39     }  
40     printf("%d\n",ans%20123);//對於2013取模    
41     return 0;   
42 }  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM