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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Penguins

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Penguins 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Penguins

題意:

有兩個20*20的地圖,有障礙物,兩個地圖各有一個小人,左側地圖的小人要從右下角走到右上角,右側地圖的小人要從左下角走到左上角,這兩個小人是鏡像移動的,

左側小人右側小人
左移動右移動
右移動左移動
上移動上移動

現在問最短路徑是多少,且輸出移動情況,并要求移動的字典序最小
(D<L<R<U)

題解:

BFS模擬,兩個人同步移動
沒啥說的,就是純BFS模擬過程,詳細看代碼

代碼 :

#include<bits/stdc++.h> using namespace std; const int maxn=20+10; //string mp1[maxn]; //string mp2[maxn]; char mp[2][maxn][maxn]; char mp1[maxn][maxn]; char mp2[maxn][maxn]; int vis[maxn][maxn][maxn][maxn]; int turn[4][2]={0,-1,0,1,-1,0,1,0}; int turn2[4][2]={0,1,0,-1,-1,0,1,0}; struct node{int x1,y1,x2,y2;string s; }; char ss[15]="LRUD"; bool check(int x1,int y1,int id) {if(x1>20||y1>20||x1<=0||y1<=0)return 0;if(mp[id-1][x1][y1]=='#'){return 0;}return 1;} node ans; int len=0; int bfs() {queue<node >q;node t1;t1={20,20,20,1,""};q.push(t1);while(!q.empty()){node now=q.front();q.pop();if(vis[now.x1][now.y1][now.x2][now.y2]==1)continue;vis[now.x1][now.y1][now.x2][now.y2]=1;if(now.x1==1&&now.y1==20&&now.x2==1&&now.y2==1){ans=now;return now.s.size();}for(int i=0;i<4;i++){int nx1,ny1,nx2,ny2;nx1=now.x1+turn[i][0];ny1=now.y1+turn[i][1];nx2=now.x2+turn2[i][0];ny2=now.y2+turn2[i][1];if(check(nx1,ny1,1)==0&&check(nx2,ny2,2)==0)//左右都不能走 {continue;}if(check(nx1,ny1,1)==1&&check(nx2,ny2,2)==0)//左邊能走,右邊不能走 {t1={nx1,ny1,now.x2,now.y2,now.s+ss[i]};q.push(t1);}if(check(nx1,ny1,1)==0&&check(nx2,ny2,2)==1)//右邊能走 {t1={now.x1,now.y1,nx2,ny2,now.s+ss[i]};q.push(t1);}if(check(nx1,ny1,1)==1&&check(nx2,ny2,2)==1){t1={nx1,ny1,nx2,ny2,now.s+ss[i]};q.push(t1);}}}} void pr() {mp[0][20][20]='A';mp[1][20][1]='A';int nx1,ny1,nx2,ny2;nx1=20,ny1=20,nx2=20,ny2=1;for(int i=1;i<=len;i++){if(ans.s[i-1]=='L'){if(check(nx1+turn[0][0],ny1+turn[0][1],1))//左側可以走 {nx1=nx1+turn[0][0];ny1=ny1+turn[0][1];}if(check(nx2+turn2[0][0],ny2+turn2[0][1],2))//右側可以走 {nx2=nx2+turn2[0][0];ny2=ny2+turn2[0][1];}}else if(ans.s[i-1]=='R'){if(check(nx1+turn[1][0],ny1+turn[1][1],1)){nx1=nx1+turn[1][0];ny1=ny1+turn[1][1];}if(check(nx2+turn2[1][0],ny2+turn2[1][1],2)){nx2=nx2+turn2[1][0];ny2=ny2+turn2[1][1];}}else if(ans.s[i-1]=='U'){if(check(nx1+turn[2][0],ny1+turn[2][1],1)){nx1=nx1+turn[2][0];ny1=ny1+turn[2][1];}if(check(nx2+turn2[2][0],ny2+turn2[2][1],2)){nx2=nx2+turn2[2][0];ny2=ny2+turn2[2][1];}} else{if(check(nx1+turn[3][0],ny1+turn[3][1],1)){nx1=nx1+turn[3][0];ny1=ny1+turn[3][1];}if(check(nx2+turn2[3][0],ny2+turn2[3][1],2)){nx2=nx2+turn2[3][0];ny2=ny2+turn2[3][1];}}mp[0][nx1][ny1]='A';mp[1][nx2][ny2]='A';} } int main() {for(int i=1;i<=20;i++){scanf("%s %s",mp[0][i]+1, mp[1][i]+1);}//mp[0]表示左側圖,mp[1]表示右側圖 len=bfs();cout<<len<<endl;cout<<ans.s<<endl;pr();//標記移動路徑 for(int i=1;i<=20;i++){for(int j=1;j<=20;j++){cout<<mp[0][i][j];}cout<<" ";for(int j=1;j<=20;j++){cout<<mp[1][i][j];}cout<<endl;} return 0; }

總結

以上是生活随笔為你收集整理的Penguins的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。