#include<bits/stdc++.h>
using namespace std;
queue<int>x,x1;
int vis[1001][1001],ans[1001][1001]={-1};
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
char a[1140][1140];
int main(){
int n,m,start_x,start_y,fx,fy;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
if(a[i][j]='M'){
fx=i;
fy=j;
}else if(a[i][j]='@'){
start_x=i;
start_y=j;
}
}
}
x.push(start_x);
x1.push(start_y);
ans[start_x][start_y]=0;
vis[start_x][start_y]=1;
while(!x.empty()){
for(int i=0;i<4;i++){
int next_x=x.front()+dx[i];
int next_y=x1.front()+dy[i];
if((next_x>0&&next_x<=n)&&(next_y>0&&next_y<=m)&&vis[next_x][next_y]==0&&(a[next_x][next_y]=='.'||a[next_x][next_y]=='G')){
vis[next_x][next_y]=1;
if(a[next_x][next_y]=='G') ans[next_x][next_y]=ans[x.front()][x1.front()]+2;
else ans[next_x][next_y]=ans[x.front()][x1.front()]+1;
x.push(next_x);
x1.push(next_y);
}
}
x.pop();
x1.pop();
}
if(ans[fx][fy]==-1) cout<<"You can't save Mengxin";
else cout<<ans[fx][fy];
return 0;
}
1 个赞
题目:
C. 营救计划
Problem ID: 3585
Contest ID: 5350
选做题
Runtime Error
时间限制:0.2s 空间限制:128M
题目描述:
在一个 n∗m 的迷宫里,有一个萌新被困住了,你作为一个久经码场的战士,决定去营救萌新。地图中还会有一些守卫,你必须打败守卫才能通过守卫所在的位置,打败守卫需要花费 1 分钟,移动一步也需要花费 1 分钟,每次你只能往上下左右某个方向移动一步。问你最少需要花费多少时间才能救到萌新。
输入格式:
第一行输入两个整数 n,m。(1≤n,m≤1000)
接下来 n 行每行输入 m 个字符
‘#’ 代表障碍物,无法直接通过
‘.’ 代表空地,可以直接通过
‘G’ 代表守卫,你需要打败他才能通过
‘M’ 代表萌新所在的位置
‘@’ 表示你所在的位置
输出格式:
如果可以营救到萌新,就输出最少需要花费的分钟数
如果不可以,则输出 “You can’t save Mengxin”
样例输入1:
7 8 #.#####. #.M#…@. #…#G… …#…#.# #…##… .#… …
样例输出1:
13
样例输入2:
2 2 M. G@
样例输出2:
2
1 个赞
改一下思路吧,我用的是结构体+列表,然后用flag变量做标记
源码贴在下面 ![]()
struct node{
int x,y,step;
}arr[10005],st,ed,now,nxt;
char mp[1005][1005];
int vis[1005][1005];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool operator < (node a,node b){
return b.step < a.step;
}
int main(){
int n,m,t,flag;
flag=0;
priority_queue<node>q;
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> mp[i]+1;
for(int j=1;j<=m;j++){
if(mp[i][j]=='@'){
st.x=i,st.y=j;
}
if(mp[i][j]=='M'){
ed.x=i,ed.y=j;
}
}
}
st.step=0;
q.push(st);
vis[st.x][st.y]=1;
while(q.size()){
now=q.top();
if(now.x==ed.x&&now.y==ed.y){
cout << now.step << endl;
flag=1;
break;
}
for(int i=0;i<4;i++){
nxt=now;
nxt.x+=dir[i][0];
nxt.y+=dir[i][1];
if(nxt.x>=1&&nxt.x<=n&&nxt.y>=1&&nxt.y<=m&&!vis[nxt.x][nxt.y]&&mp[nxt.x][nxt.y]!='#'){
if(mp[nxt.x][nxt.y]=='G'){
nxt.step+=2;
}else nxt.step+=1;
q.push(nxt);
vis[nxt.x][nxt.y]=1;
}
}
q.pop();
}
if(!flag){
cout << "You can't save Mengxin";
}
return 0;
}
1 个赞