2021图灵杯 E-nn与游戏

E.

E-nn与游戏_第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 (nowcoder.com)

链接:https://ac.nowcoder.com/acm/contest/27302/E
来源:牛客网

image-20220118171056633

先聊聊我对广搜的认识:以一个点为中心往外扩散,每遇到一个可接受的点,把点的放进队列,等到下一次使用,以此扩散至边界。

记录:用vis数组记录,传值z+1表示步数,若成功则记录并且点入队列,不成功则放弃

关于[0,n) 真心觉得c中这个数组定义下标从零开始真的是烦,有些题目又是从1开始,闭区间,开区间常常会搞错,综合考虑我还是接受从1开始的数组,以后尽量在每一题中体现我的思想。

关于rep,由于我用了 rep和rrep来代替for,经常会被迷惑,还会在题目中嵌套使用,不小心就把i的范围改了,重新循环的时候直接退出。

关于变量名称的定义,这里还需要斟酌,有的时候真的会迷惑!!!!!!

思路:

1.记录:记录障碍,记录控制单位和敌对单位。

2.扩散:以控制单位为中心(记录)x1y1,敌对中心为目标x2y2。

3.队列: 以pair形式储存,同时pair又存在map中来标记是否出现

3.函数:用于扩散和增加步数

4.输出:vis [ x2 ] [ y2 ]-1。

对于步数的记录:主函数解析,扩散函数中赋值

作用:每次都取上次的步数,防止出现重复计算,以及保证是最小值

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define debug(x) cout<<"------"<<x<<"-----\n"
#define ok() cout<<"YES\n"
#define gg() cout<<"NO\n"
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(0);
typedef pair <int ,int >PII;
typedef vector <int > VI;
const int mod = 1e9+7;
const int INF =0x3f3f3f3f;
const int N=100010;
using LL=long long;
queue<PII>qe;
map<PII,int>ma;
int x2,y2,n;
int vis[1005][1005];
int bari[1005][1005];
int p[11][5];
void ks(int x,int y,int z)
{
//找着,且是第一次就找着
if(x==x2&&y==y2&&!vis[x][y])
{
vis[x][y]=z;
}else if(x<1||x>n||y<1||y>n||vis[x][y]||bari[x][y]||ma.count({x,y}))
//满足边界,正好踏到了其他点上,遇到了障碍 ,已经找过这个点
{
return;
}else
{
vis[x][y]=z;
qe.push({x,y});
}
}
signed main()
{
int m,t,x,y;
cin>>n>>m;
rep(i,1,m)
{
cin>>x>>y;
x++;y++;
bari[x][y]=-1; //障碍
}
cin>>t;
rep(i,1,t)
{
rep(j,1,4)
{
cin>>p[i][j];
p[i][j]++;
}
ma[{p[i][1],p[i][2]}]++;
ma[{p[i][3],p[i][4]}]++;
}
rep(k,1,t)
{
rep(i,1,n)
rep(j,1,n)
vis[i][j]=0;
x=p[k][1];y=p[k][2];x2=p[k][3];y2=p[k][4];
while(!qe.empty()) qe.pop();
qe.push({x,y});
vis[x][y]=1;
while(!qe.empty())
{
auto f=qe.front();
x=f.fi;y=f.se;
qe.pop();
int z=vis[x][y];
ks(x+1,y,z+1);
ks(x-1,y,z+1);
ks(x,y+1,z+1);
ks(x,y-1,z+1);
}
cout<<vis[x2][y2]-1<<endl;
}
}

本文作者:TimMCBen

本文链接:https://www.cnblogs.com/TimMCBen/p/15999749.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TimMCBen  阅读(79)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.