OpenJ_Bailian——4115鸣人和佐助(带状态的A*)
生活随笔
收集整理的這篇文章主要介紹了
OpenJ_Bailian——4115鸣人和佐助(带状态的A*)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
鳴人和佐助| Time Limit:?1000MS | Memory Limit:?65536KB | 64bit IO Format:?%I64d & %I64u |
?
Submit?Status
Description
佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?
已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每一個單位的查克拉可以打敗一個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動一個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?
Input
輸入的第一行包含三個整數:M,N,T。代表M行N列的地圖和鳴人初始的查克拉數量T。0 < M,N < 200,0 ≤ T < 10?后面是M行N列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。
Output
輸出包含一個整數R,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。Sample Input
樣例輸入1 4 4 1 #@## **## ###+ **** 樣例輸入2 4 4 2 #@## **## ###+ ****Sample Output
樣例輸出1 6 樣例輸出2 4?
跟上一題一個意思……狀態差不多……神奇的是這題居然沒人做……A*比普通BFS慢……估計是數據太小和我估價函數選的搓的緣故。1A水
代碼:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define INF 0x3f3f3f3f #define MM(x,y) memset(x,y,sizeof(x)) typedef pair<int,int> pii; typedef long long LL; const double PI=acos(-1.0); const int N=205; struct info {int x;int y;int zkl;int step;int h;bool operator<(const info &b)const{if(step+h!=b.step+b.h)return step+h>b.step+b.h;if(step!=b.step)return step>b.step;if(zkl!=b.zkl)return zkl>b.zkl;} }; info S,T,direct[4]={{0,1,1,0},{0,-1,1,0},{1,0,1,0},{-1,0,1,0}}; inline info operator+(const info &a,const info &b) {info c;c.x=a.x+b.x;c.y=a.y+b.y;c.step=a.step+b.step;return c; } inline bool operator==(const info &a,const info &b) {return (a.x==b.x&&a.y==b.y); } int n,m,t; char pos[N][N]; int vis[N][N][10]; priority_queue<info>Q; void init() {MM(pos,0);MM(vis,0);while (!Q.empty())Q.pop(); } bool check(const info &a) {return (a.x>=0&&a.x<m&&a.y>=0&&a.y<n&&a.zkl<=t&&!vis[a.x][a.y][a.zkl]); } inline int ABS(const int &n) {return n<0?-n:n; } int main(void) {int i,j,r;while (~scanf("%d%d%d",&m,&n,&t)){r=-1;init();for (i=0; i<m; i++){scanf("%s",pos[i]);for (j=0; j<n; j++){if(pos[i][j]=='@'){S.x=i;S.y=j;S.step=0;S.zkl=0;}else if(pos[i][j]=='+'){T.x=i;T.y=j;}}}S.h=S.step+ABS(S.x-T.x)+ABS(S.y-T.y);Q.push(S);vis[S.x][S.y][S.zkl]=1;while (!Q.empty()){info now=Q.top();Q.pop();if(now==T){r=now.step;break;}for (i=0; i<4; i++){info v=now+direct[i];v.zkl=now.zkl+(pos[v.x][v.y]=='#');if(check(v)){v.step=now.step+1;v.h=v.step+ABS(v.x-T.x)+ABS(v.y-T.y);Q.push(v);vis[v.x][v.y][v.zkl]=1;}}}printf("%d\n",r);}return 0; }轉載于:https://www.cnblogs.com/Blackops/p/5766294.html
總結
以上是生活随笔為你收集整理的OpenJ_Bailian——4115鸣人和佐助(带状态的A*)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UEditor添加自定义弹窗 插入音频地
- 下一篇: winform界面闪退