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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)

發布時間:2024/9/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目999
題目信息
執行結果
本題排行
討論區

師傅又被妖怪抓走了
時間限制:1000 ms | 內存限制:65535 KB
難度:3

描寫敘述

話說唐僧復得了孫行者,師徒們一心同體,共詣西方。自寶象國救了公主,承君臣送出城西。沿路饑餐渴飲,悟空便為師傅去化齋。等悟空回來,悟凈慌慌張張的對悟空說:“不好了,不好了”,還沒等悟凈說完,悟空說:“師傅又被妖怪抓走了”,悟凈:“NO!” ,悟空一臉茫然。悟凈:“師傅和二師兄都被妖怪抓走了”。悟空(暈!

)。

為了防止悟空救人,妖怪先把唐憎和八戒分別藏起來,如果悟空在T分鐘之后還沒找到人。那必然是被妖怪吃掉了。如果悟空在一個n行m列的矩陣內,悟空在每一分鐘能夠走到上,下,左,右的當中的一個能夠走的位置,每次僅僅能走一步。

我們把發現定義為能夠直接看到對方,也就是說兩個人在同一行或者同一列,而且中間沒有障礙物或者沒有其它人就能夠看到對方。



輸入
有多組測試數據,每組首先是三個正整數n , m (3<=n,m<=100), T,(0<=T<=100) 分別代表行數,列數,規定的時間。接下來n 行,每行 m 個字符。

當中’ S ’ 代表悟空的位置,’ D ’代表師傅位置,’ E ’代表八戒的位置。而且保證都僅僅有一個. ’ X ’代表墻 ,’ . ’代表空地 .
輸出
每組先輸出一行Case c:(c表示當前的組數。從1開始計數);
接下來一行。假設悟空能夠在規定時間內找到兩人,則輸出最少須要的時間,否則輸出-1。
例子輸入

5 6 3
XXD...
....E.
....X.
....S.
......
5 6 3
XDX...
....E.
......
....S.
......
5 6 8
XXDX..
.XEX..
......
....S.
......

例子輸出

Case 1:
-1
Case 2:
3
Case 3:
-1

這道題讓我非常焦灼啊。。。開個玩笑 哈哈

這道題的發現定義為能夠直接看到對方。所以是不能走X D E 僅僅能是看到

所以在錄入數據的時候 我們就提前做好預處理。

把D E的四個方向 能看到的地方都處理一下

然后就是bfs了 而在這里 我提交了幾次 發現都不正確 后來無意中的一個數據啟示了我

2 3 1

.S.

DXE

輸出-1

2 3 3

.S.

DXE

輸出3

聰明的你 看出來了嗎?假設我們用通常的vis數組標記走過的路徑
,對于第二條測試數據 僅僅會輸出-1? 由于它不會走回頭路 。我又存在僥幸的心理 不用vis數組標記了 發現 果然TLE

?然后就是不做了 走在路上還在想 到底在這里該怎么優化 。。。果然 睡覺的時候被我想到了 今天早上一大早 就起來做了。

詳細方法是 假設又定義了兩個數組visE【x】【y】 visD【x】【y】分別記錄在x,y點 是否已經找到過E 或D? 。

當某個點已經遍歷過

我們再推斷當前的visD 和visE和之前的是否一致? 假設一致 我們就不用走 假設不一致 證明我們在其他點找到了D或E? 如今要回來。

詳細看代碼把

#include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; int n,m; int t; int s1,s2; int d1,d2; int e1,e2; int dir[4][2]={1,0,0,1,-1,0,0,-1}; char map[105][105]; bool visD[105][105]; bool visE[105][105]; bool vis[105][105]; struct node {int x,y;int step;bool isfindD;bool isfindE;friend bool operator<(node a,node b){return a.step>b.step;} }; void prepare(int x,int y,char ch) {char ch2;int x2,y2;if(ch=='D')ch2='E',x2=e1,y2=e2;elsech2='D',x2=d1,y2=d2;for(int i=x-1;i>=0;i--){if(map[i][y]=='X'||i==x2&&y==y2)break;if(map[i][y]=='.')map[i][y]=ch;else if(map[i][y]==ch2)map[i][y]='*';else if(map[i][y]=='S'){map[i][y]=ch;break;}}for(int i=x+1;i<n;i++){if(map[i][y]=='X'||i==x2&&y==y2)break;if(map[i][y]=='.')map[i][y]=ch;else if(map[i][y]==ch2)map[i][y]='*';else if(map[i][y]=='S'){map[i][y]=ch;break;}}for(int i=y+1;i<m;i++){if(map[x][i]=='X'||x==x2&&i==y2)break;if(map[x][i]=='.')map[x][i]=ch;else if(map[x][i]==ch2)map[x][i]='*';else if(map[x][i]=='S'){map[x][i]=ch;break;}}for(int i=y-1;i>=0;i--){if(map[x][i]=='X'||x==x2&&i==y2)break;if(map[x][i]=='.')map[x][i]=ch;else if(map[x][i]==ch2) map[x][i]='*';else if(map[x][i]=='S'){map[x][i]=ch;break;}} } bool limit(int x,int y) {if(x==d1&&y==d2)return false;if(x==e1&&y==e2)return false;if(x<0||y<0||x>=n||y>=m||map[x][y]=='X')return false;return true; } void check_result(node &temp1) {int x=temp1.x;int y=temp1.y;if(map[x][y]=='D')temp1.isfindD=true;else if(map[x][y]=='E')temp1.isfindE=true;else if(map[x][y]=='*')temp1.isfindD=temp1.isfindE=true; } int bfs(int x1,int y1,int time) {node temp1,temp2;priority_queue<node>s;while(!s.empty())s.pop();temp1.x=x1;temp1.y=y1;temp1.step=0;temp1.isfindD=temp1.isfindE=false;check_result(temp1);visE[x1][y1]=temp1.isfindE;visD[x1][y1]=temp1.isfindD;vis[x1][y1]=true;s.push(temp1);while(!s.empty()){temp1=temp2=s.top();s.pop();if(temp1.step>time)return -1;if(temp1.isfindD&&temp1.isfindE)return temp1.step; for(int i=0;i<4;i++){int x1=temp1.x+dir[i][0];int y1=temp1.y+dir[i][1];if(limit(x1,y1)&&(!vis[x1][y1]||!(visE[x1][y1]==temp1.isfindE&&visD[x1][y1]==temp1.isfindD))){temp1.x=x1;temp1.y=y1;temp1.step++;check_result(temp1);vis[x1][y1]=true;visE[x1][y1]=temp1.isfindE;visD[x1][y1]=temp1.isfindD; s.push(temp1);temp1=temp2;}}}return -1; } int main() {int ncase=1;while(~scanf("%d %d %d",&n,&m,&t)){memset(map,0,sizeof(map));for(int i=0;i<n;i++){getchar();for(int j=0;j<m;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S'){s1=i;s2=j;}if(map[i][j]=='D'){d1=i;d2=j;}if(map[i][j]=='E'){e1=i;e2=j;}}}prepare(d1,d2,'D');prepare(e1,e2,'E');memset(visD,false,sizeof(visD));memset(visE,false,sizeof(visE));memset(vis,false,sizeof(vis));printf("Case %d:\n%d\n",ncase++,bfs(s1,s2,t));} }

總結

以上是生活随笔為你收集整理的nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。

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