NOIP模拟题——来自风平浪静的明天
【題目描述】
冬眠了五年,光終于從夢中醒來。
千咲、要,大家都在。
隱約記得“昨天”的海船祭,愛花意外成為貢女,沉入海底。
海面冰封,卻有絲絲暖流在冰面之下涌動。
此時,愛花沉睡在祭海女神的墓地。她的胞衣在一點點脫落,化作一簇簇暖流,夾雜著她的感情,向海面上涌去。
愛花,你在哪里?
五年之后,紡已經(jīng)成為海洋學(xué)研究科的大學(xué)生。
在紡的幫助下,光得知了海面下海流的情況。
紡告訴光,暖流一旦產(chǎn)生,就會不斷地向四周擴散,直到遇到海中的巖石。
紅腹海牛,快告訴光,愛花在哪里。
紡幫你繪制了一張海流情況圖,長度為N,寬度為M。
海很大,一邊有沙灘,一邊一望無際,但長度和寬度都不會超過300。沙灘是金黃色的,所以用Y表示。海是藍色的,所以用B表示。暖流很暖和,所以用H表示
海中有大大小小的石頭。石頭很危險,所以用X表示
光相信自己一定能找到愛花(愛花的位置只有一種可能)
【輸入格式】
第一行包括兩個整數(shù)N,M。
接下來N行,每行M個字符。
【輸出格式】
僅一行,表示愛花的位置(如果你無能為力,請輸出 -1 ,只要你盡力,光不會責(zé)怪你)
【樣例輸入】
5 5
YYYHB
YYHHH
YHHXB
BBHBB
BBBBB
【樣例輸出】
2 3
【數(shù)據(jù)范圍】
對于30%的數(shù)據(jù),n,m<=10
對于70%的數(shù)據(jù),n,m<=100
對于100%的數(shù)據(jù),n,m<=300
【樣例解釋】
在(2,3)出現(xiàn)第一個H后,經(jīng)過3s后,出現(xiàn)樣例輸入的地圖。
P.S. Mushroom拜托他GF出的這題= =
?
題目寫的真好~~~~~~~~~~只是我看不懂。
后來才曉得一開始給的圖只是一個普通狀態(tài)而不是最終狀態(tài)(所以就誤將碰到石頭理解為再向下漫延一次就停下來了。。)
正解:f[T][x][y]表示從map[x][y]開始,漫延時間為T的情況是否匹配
(不應(yīng)是H的地方出現(xiàn)了H則不相符,應(yīng)出現(xiàn)H的地方?jīng)]有出現(xiàn)H認為相符)
?
YYYHB
YYHHH
YHHXB
BBHBB
BBBBB
海流圖
YYYBB
YYHHB
YBHXB
BBBBB
BBBBB
相符的圖(藍色部分應(yīng)該出現(xiàn)H但沒有出現(xiàn))
YYYHH
YYHHH
YHHXH
BHHHB
BBHBB
不相符的圖(紅色部分不該出現(xiàn)H但出現(xiàn)了)
?
于是得到DP方程:F[T][X][Y]=F[T-1][X-1][Y]&&F[T-1][X][Y-1]&&F[T-1][X+1][Y]&&F[T-1][X][Y+1]
時間復(fù)雜度O(n3)
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 const int maxn=305; 8 char map[maxn][maxn]; 9 bool f[2*maxn][maxn][maxn]; 10 bool pd[2*maxn][maxn][maxn]; 11 char c[maxn]; 12 int n,m; 13 bool solve(int T,int x,int y) 14 { 15 if(pd[T][x][y])return f[T][x][y]; 16 if(x==0||y==0)return true; 17 if(x==n+1||y==m+1)return true; 18 if(map[x][y]!='H')return true; 19 if(T==0) 20 { 21 pd[T][x][y]=true; 22 f[T][x][y]=true; 23 return true; 24 } 25 26 if(map[x-1][y]=='B'||map[x+1][y]=='B'||map[x][y-1]=='B'||map[x][y+1]=='B') 27 { 28 pd[T][x][y]=true; 29 f[T][x][y]=false; 30 return false; 31 } 32 33 pd[T][x][y]=true; 34 f[T][x][y]=solve(T-1,x-1,y)&&solve(T-1,x+1,y)&&solve(T-1,x,y-1)&&solve(T-1,x,y+1); 35 return f[T][x][y]; 36 } 37 int main() 38 { 39 freopen("calm.in","r",stdin); 40 freopen("calm.out","w",stdout); 41 scanf("%d%d",&n,&m); 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%s",c); 45 for(int j=1;j<=m;j++) 46 map[i][j]=c[j-1]; 47 } 48 for(int i=1;i<=n+m;i++) 49 for(int j=1;j<=n;j++) 50 for(int k=1;k<=m;k++) 51 { 52 if(map[j][k]=='H') 53 solve(i,j,k); 54 } 55 for(int i=n+m;i>=1;i--) 56 for(int j=1;j<=n;j++) 57 for(int k=1;k<=m;k++) 58 { 59 if(f[i][j][k]) 60 { 61 printf("%d %d",j,k); 62 return 0; 63 } 64 } 65 return 0; 66 }這個DP方程真心NB,考場上能想到這樣做就幸福了~
轉(zhuǎn)載于:https://www.cnblogs.com/937337156Zhang/p/6017461.html
總結(jié)
以上是生活随笔為你收集整理的NOIP模拟题——来自风平浪静的明天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读后感:你的灯亮着吗
- 下一篇: 2015上半年软件设计师考点,难点3