1825 Corn Maze S
首先分析题意
有一个传送点也就是从头传到尾得一个装置,搜素得时候遇见了就必须使用,我觉得我可以推测出大意了
其实这个题就是一个很简单得广搜
只不过,多了一个传送门,可以节省一些时间
所以我们就得判断了,比较复杂
貌似这个题是一个贪心,当然只是我觉得
我觉得最优化,当然是能省就省,能快就快
或者就是深搜
这个题得搜索思路非常明显
还有就是一个常识,队列压入得一个常识,就是((str){x1,x2,x3}),str就是结构体的类型
其实这个不就是贪心吗
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int size=400;
struct str{
int x;
int y;//记录横纵坐标
int time;//记录时间
};
queue<str> que;
int n,m;int startx,starty;
string s;
char c[size][size];
int a[size][size];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};//方位数组,上下左右
bool book[size][size];
void chuansongmen(int &nextx,int &nexty,int kkk)//搜索传送门,当前位置和时间
//说白了还是一个贪心
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==a[nextx][nexty]&&(i!=nextx||j!=nexty))//不是同一个点
{
nextx=i,nexty=j;
return;//传送了
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s;
for(int j=1;j<=m;j++)
{
a[i][j]=s[j-1];
if(a[i][j]=='@')
{
startx=i;
starty=j;//记录起点
}
}
}
que.push((str){startx,starty,0});//从起点开始,将起点压入
//这是一个格式
while(!que.empty())
{
str q=que.front();
que.pop();//获取队头,然后出队
if(a[q.x][q.y]=='=')
{
cout<<q.time<<endl;//搜到结果
return 0;
}
if(a[q.x][q.y]>='A'&&a[q.x][q.y]<='Z')//贪心传送门
{
chuansongmen(q.x,q.y,q.time);
}
for(int i=0;i<=3;i++)
{
int nextx,nexty;
nextx=q.x+dx[i];
nexty=q.y+dy[i];
if(nextx>=1&&nextx<=n&&nexty>=1&&nexty<=m&&a[nextx][nexty]!='#'&&book[nextx][nexty]==0)
{
book[nextx][nexty]=1;
que.push((str){nextx,nexty,q.time+1});
}
}
}
return 0;
}