題目意思:給你乙個n*m的迷宮,+能走,*障礙物,乙個胖子一開始在3,3,體積為5*5
不過胖子走迷宮的目的是為了**,給你乙個時間k,當到達時間k時,胖子餓瘦了變成3*3,當到達時間2*k時,更瘦了變成1*1
題目要求到達(n-2,m-2)這個點所需的最短時間。
n,m<=300,
解決思路,參考hdu1026,bfs+優先佇列(這裡如果 不直接原地跳躍到k時刻,而是選擇time+1呆在原地,那麼不用優先佇列也可以,優先佇列的作用是,每一層擴充套件開來的結點是會改變時刻的,比如說hdu1026是要在乙個節點打怪打幾個小時,而普通的佇列bfs,以其擴充套件順序為時刻,所以按順序搜尋就行了)
注意幾點:
1.四個方向的寫法:int foot[4][2]=;
2.根據當前時間判斷胖子大小,然後決定胖子在原地待多少時間(k或者2k)
3.學會了freopen重定向的寫法
4.迷宮問題還是在周圍附一圈邊界寫起來方便
5.pre陣列主要是為了記錄路徑方便檢視(來自hdu1026),print1函式也是為了列印路徑,可忽略。
6.可以嘗試que.push();(與定義int ti,x,y,da;順序相對應)的寫法
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
char a[310][310];
bool p[310][310];
int n,m,k,dada,num;
int foot[4][2]=;
struct node
};priority_queueq;
struct route
pre[310][310][6];
bool pan(int x,int y,int da)
int bfs()
else
q.push(nex);
pre[nex.x][nex.y][nex.da].x=w.x;
pre[nex.x][nex.y][nex.da].y=w.y;
pre[nex.x][nex.y][nex.da].da=w.da;
pre[nex.x][nex.y][nex.da].ti=w.ti;}}
q.pop();
if (q.empty()) break;
w=q.top();
}dada=w.da;
if (!q.empty()) return w.ti;
else return 0;
}void print1(int n,int m,int dad,int tt)*/}
int main()
getchar();
}for (int i=0;i<4;i++)
//return 0;
printf("%d %d\n",n,m);
for (int i=1;i<=n;i++)
printf("\n");
}for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
while (!q.empty()) q.pop();
memset(p,0,sizeof(p));
memset(pre,0,sizeof(pre));
int ans=bfs();
printf("%d\n",ans);
num=0;
/*for (int i=1;i<=n;i++)
printf("\n");
}*/print1(n-2,m-2,dada,ans);
fclose(stdin);//關閉檔案
fclose(stdout);//關閉檔案
return 0;
}
結果:
第十屆藍橋杯 JavaA 迷宮
法一 思路 bfs,path記錄路徑。1.程式設計 2.觀察 description todo author frontier time 2019年4月9日 上午11 19 05 class node public class d迷宮 增量陣列,方向向量,直接按字典序排列 static int y ...
2019第十屆藍橋杯C C
這是我第一次參加藍橋杯比賽,比完後,有點低於預期,自己的發揮低於預期,賽事水準也低於預期。教室裡面很多同學的電腦出現問題,舉辦學校也沒有完善的應急方案,有一部分同學11點鐘才可以做題。提取碼 560f1.給20個球員擔任五個不同位置的得分,要你選五個球員組成一支球隊的最大得分。這道題要是全排列做的話...
第十屆藍橋杯CB題目I 分析
思路分析 感謝寫文博主 思路 相信大多數人和我一樣在比賽的時候把這題想的太簡單了 這題和去年的最後一題很類似,就是分類討論,去年放在了最後一題,今年在倒數第二題,說明難度不算太難,分析出來了就會覺得emmm好坑 那麼下面開始分析,我是按照符號的個數和負數的個數來分類討論的 負號個數為0,那麼沒有辦法...