日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

火星探险问题

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 火星探险问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述
火星探險(xiǎn)隊(duì)的登陸艙將在火星表面著陸,登陸艙內(nèi)有多部障礙物探測(cè)車。登陸艙著陸后,探測(cè)車將離開(kāi)登陸艙向先期到達(dá)的傳送器方向移動(dòng)。探測(cè)車在移動(dòng)中還必須采集巖石標(biāo)本。每一塊巖石標(biāo)本由最先遇到它的探測(cè)車完成采集。每塊巖石標(biāo)本只能被采集一次。巖石標(biāo)本被采集后,其他探測(cè)車可以從原來(lái)巖石標(biāo)本所在處通過(guò)。探測(cè)車不能通過(guò)有障礙的地面。本題限定探測(cè)車只能從登陸處沿著向南或向東的方向朝傳送器移動(dòng),而且多個(gè)探測(cè)車可以在同一時(shí)間占據(jù)同一位置。如果某個(gè)探測(cè)車在到達(dá)傳送器以前不能繼續(xù)前進(jìn),則該車所采集的巖石標(biāo)本將全部損失。

用一個(gè) P·Q 網(wǎng)格表示登陸艙與傳送器之間的位置。登陸艙的位置在(X1,Y1)處,傳送器

的位置在(XP ,YQ)處。

X 1,Y 1 X 2 , Y 1 X 3 , Y 1 … X P-1, Y 1 X P , Y 1

X 1,Y 2 X 2 , Y 2 X 3 , Y 2 … X P-1, Y 2 X P , Y 2

X 1, Y 3 X 2 , Y 3 X 3 ,Y 3 … X P-1, Y 3 X P , Y 3

… …

X 1 ,Y Q-1 X 2 , Y Q-1 X 3 , Y Q-1 … X P-1, Y Q-1 X P , Y Q-1

X 1,Y Q X 2 , Y Q X 3 , Y Q … X P-1, Y Q X P ,Y Q

給定每個(gè)位置的狀態(tài),計(jì)算探測(cè)車的最優(yōu)移動(dòng)方案,使到達(dá)傳送器的探測(cè)車的數(shù)量最多,

而且探測(cè)車采集到的巖石標(biāo)本的數(shù)量最多

輸入格式
第 1行為探測(cè)車數(shù),第 2 行為 P 的值,第3 行為Q 的值。接下來(lái)的 Q 行是表示登陸艙與傳送器之間的位置狀態(tài)的 P·Q 網(wǎng)格。用 3 個(gè)數(shù)字表示火星表面位置的狀態(tài):0 表示平坦無(wú)障礙,1表示障礙,2 表示石塊。

輸出格式
每行包含探測(cè)車號(hào)和一個(gè)移動(dòng)方向,0 表示向南移動(dòng),1 表示向東移動(dòng)。

輸入輸出樣例
輸入 #1 復(fù)制

2
10
8
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 0 1 0 2 0 0 0 0
1 1 0 1 2 0 0 0 0 1
0 1 0 0 2 0 1 1 0 0
0 1 0 1 0 0 1 1 0 0
0 1 2 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0
輸出 #1 復(fù)制
1 1
1 1
1 1
1 1
1 0
1 0
1 1
1 1
1 1
1 1
1 0
1 0
1 1
1 0
1 0
1 0
2 1
2 1
2 1
2 1
2 0
2 0
2 0
2 0
2 1
2 0
2 0
2 1
2 0
2 1
2 1
2 1
說(shuō)明/提示
車數(shù),P,Q<=35


因?yàn)槊總€(gè)石塊只會(huì)被采集一次,所以很明顯的拆點(diǎn)限制采集。但是當(dāng)時(shí)我寫的時(shí)候想到如果我們對(duì)于每個(gè)點(diǎn),連出去的時(shí)候連一條流量為1,費(fèi)用為(當(dāng)前點(diǎn)==石塊),再加一條流量為INF,費(fèi)用為0的邊(很傻逼是吧。。。。。因?yàn)槊總€(gè)點(diǎn)會(huì)連出去兩次,所以可能被用兩次。。。。QAQ。。所以還是要拆點(diǎn))。


AC代碼:

#pragma GCC optimize(2) #include<bits/stdc++.h> //#define int long long using namespace std; const int N=32000,M=1000010; const int inf=0x3f3f3f3f; int num,n,m,g[40][40],s,t,v[N],e[N],d[N],maxflow,base; int head[N],nex[M],to[M],w[M],flow[M],tot=1; inline void ade(int a,int b,int c,int d){to[++tot]=b; w[tot]=d; flow[tot]=c; nex[tot]=head[a]; head[a]=tot; } inline void add(int a,int b,int c,int d){ade(a,b,c,d); ade(b,a,0,-d); } inline int id(int x,int y){return (x-1)*m+y; } int spfa(){memset(d,0xcf,sizeof d); queue<int> q; q.push(s);int vis[N]={0}; d[s]=0; vis[s]=1;while(q.size()){int u=q.front(); q.pop(); vis[u]=0;for(int i=head[u];i;i=nex[i]){if(flow[i]&&d[to[i]]<d[u]+w[i]){d[to[i]]=d[u]+w[i];v[to[i]]=u; e[to[i]]=i;if(!vis[to[i]]) q.push(to[i]),vis[to[i]]=1;}}}return d[t]!=0xcfcfcfcf; } void EK(){while(spfa()){int mi=inf;for(int i=t;i!=s;i=v[i]) mi=min(mi,flow[e[i]]);for(int i=t;i!=s;i=v[i]) flow[e[i]]-=mi,flow[e[i]^1]+=mi; maxflow+=mi;} } void out(int p,int x){for(int i=head[x+base];i;i=nex[i]){if(flow[i^1]&&to[i]!=t&&x<to[i]){flow[i^1]--; cout<<p<<' ';if(to[i]==1+x) cout<<1<<endl; else cout<<0<<endl;return out(p,to[i]);}} } signed main(){cin>>num>>m>>n; s=0; t=2*n*m+1; add(s,1,num,0); base=n*m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int x; cin>>x; if(x==1) continue;add(id(i,j),id(i,j)+base,1,x);add(id(i,j),id(i,j)+base,inf,0);if(i+1<=n) add(id(i,j)+base,id(i+1,j),inf,0);if(j+1<=m) add(id(i,j)+base,id(i,j+1),inf,0);}}add(id(n,m)+base,t,num,0);EK();for(int i=1;i<=maxflow;i++) out(i,1);return 0; }

總結(jié)

以上是生活随笔為你收集整理的火星探险问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。