2021图灵杯 E-nn与游戏
E.
E-nn与游戏_第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 (nowcoder.com)
链接:https://ac.nowcoder.com/acm/contest/27302/E
来源:牛客网
先聊聊我对广搜的认识:以一个点为中心往外扩散,每遇到一个可接受的点,把点的放进队列,等到下一次使用,以此扩散至边界。
记录:用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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步