題目描述 Description
傳說很遙遠的藏寶樓頂層藏着誘人的寶藏。小明歷盡千辛萬苦終於找到傳說中的這個藏寶樓,藏寶樓的門口豎着一個木板,上面寫有幾個大字:尋寶說明書。說明書的內容如下:
藏寶樓共有N+1層,最上面一層是頂層,頂層有一個房間里面藏着寶藏。除了頂層外,藏寶樓另有N層,每層M個房間,這M個房間圍成一圈並按逆時針方向依次編號為0,…,M-1。其中一些房間有通往上一層的樓梯,每層樓的樓梯設計可能不同。每個房間里有一個指示牌,指示牌上有一個數字x,表示從這個房間開始按逆時針方向選擇第x個有樓梯的房間(假定該房間的編號為k),從該房間上樓,上樓后到達上一層的k號房間。比如當前房間的指示牌上寫着2,則按逆時針方向開始嘗試,找到第2個有樓梯的房間,從該房間上樓。如果當前房間本身就有樓梯通向上層,該房間作為第一個有樓梯的房間。
尋寶說明書的最后用紅色大號字體寫着:“尋寶須知:幫助你找到每層上樓房間的指示牌上的數字(即每層第一個進入的房間內指示牌上的數字)總和為打開寶箱的密鑰”。
請幫助小明算出這個打開寶箱的密鑰。
藏寶樓共有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取模的結果即可。
第一行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
對於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 }