题目链接:点击查看

题目大意:给出斗地主的规则,以及最终分数,求出最少需要进行几局游戏

题目分析:bfs爆搜即可,因为数据范围比较小,我一开始没多想,直接18种情况全部打上去,交了一发T掉了。。bfs被卡T?于是就剪枝,剪了半天还是T,最后拿出秘密武器,用无序map+600进制维护了vis数组,就A了,因为不想出现负数,而且a,b,c的数据范围都比较小,直接都加上300变成正数然后按照600进制处理即可,没什么细节。。裸题一个。

不过虽然过了,但还是跑了800多ms,看到有的人交了30多ms的就有点在意,去网上搜了搜,发现,原来只需要维护一个二维数组即可,因为题目中保证了a+b+c恒等于0,所以枚举a和b的情况,c的情况就已经知道了,所以只需要对a和b进行操作就好了,懒得再写代码了,下次看到这种题目应该会留个印象了,挂代码吧,主要是学到了一波如何用二维思想实现三维的题目吧(虽然我还是用三维莽过去的。。)

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e6+100;int n,a,b,c;const int bb[][3]=
{
//win
2,-1,-1,//A
4,-2,-2,
6,-3,-3,
-1,2,-1,//B
-2,4,-2,
-3,6,-3,
-1,-1,2,//C
-2,-2,4,
-3,-3,6,
//lose
-2,1,1,//A
-4,2,2,
-6,3,3,
1,-2,1,//B
2,-4,2,
3,-6,3,
1,1,-2,//C
2,2,-4,
3,3,-6
};unordered_map<int,int>vis;struct Node
{int step;int a,b,c;
};int getnum(int a,int b,int c)
{return a*600*600+b*600+c;
}int bfs()
{a+=300;b+=300;c+=300;queue<Node>q;vis.clear();Node temp;temp.a=300;temp.b=300;temp.c=300;temp.step=0;q.push(temp);while(!q.empty()){Node cur=q.front();q.pop();
//      cout<<cur.step<<' '<<cur.a<<' '<<cur.b<<' '<<cur.c<<endl;
//      cout<<cur.step<<endl;if(cur.step>n)break;for(int i=0;i<18;i++){Node next;next.a=cur.a+bb[i][0];next.b=cur.b+bb[i][1];next.c=cur.c+bb[i][2];if(vis[getnum(next.a,next.b,next.c)])continue;if(next.a>600||next.b>600||next.c>600)continue;if(next.a<0||next.b<0||next.c<0)continue;vis[getnum(next.a,next.b,next.c)]=1;next.step=cur.step+1;q.push(next);if(next.a==a&&next.b==b&&next.c==c)return next.step;}}return -1;
}int main()
{scanf("%d%d%d%d",&n,&a,&b,&c);printf("%d\n",bfs());return 0;
}

中石油训练赛 - 斗地主(bfs)相关推荐

  1. 中石油训练赛 - Equidistant(bfs)

    题目链接:点击查看 题目大意:给出一棵 n 个点的树,再给出 m 个关键点,问是否存在着一个点到 m 个关键点的距离都相同,存在的话输出任意一个即可 题目分析:bfs 按层展开维护贡献就好了,记录一下 ...

  2. 中石油训练赛 - Trading Cards(最大权闭合子图)

    题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...

  3. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  4. 中石油训练赛 - Perfect Tree(dfs)

    题目描述 Given a positive integer k, we define a rooted tree to be k-perfect, if and only if it meets bo ...

  5. 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)

    题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...

  6. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)

    题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...

  7. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

  8. 中石油训练赛 - Check List(线段树维护偏序问题)

    题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...

  9. 中石油训练赛 - Bad Treap(数学)

    题目链接:点击查看 题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大 题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可 ...

最新文章

  1. 收藏 | 深度学习中神经网络的可视化解释!
  2. gperf学习笔记(二)
  3. php作业案例10,5月23日作业——实例演示查询构造器中的10个最常用的方法
  4. REVERSE-COMPETITION-HGAME2022-Week4
  5. python 自动登录网站_python自动登录网页脚本
  6. 怎么成为开源贡献者_为什么要成为开源的支持者
  7. 奔跑中的2015--成长之路
  8. 人脸检测(十二)--DDFD算法
  9. mysql基础之数据库变量(参数)管理
  10. window.onscroll页面滚动条滚动事件
  11. ImportError: No module named PyQt4.
  12. 浅谈傅里叶——5. 短时傅里叶的缺点与卷积的基本概念
  13. Everything研究之读取NTFS下的USN日志文件(2)
  14. 交通流优化的一种强化学习方法
  15. 超链接的伪类及如何清除缓存
  16. 14、yolov5-6中数据预处理、模型输出nms单独计算、onnxruntime的gpu版本前向推理
  17. 华为ensp小型综合实验
  18. B-Tree和B+Tree详解
  19. 浅谈易语言多线程 by逆风
  20. 好文分享:Google的潘多拉星球

热门文章

  1. Nginx的rewrite之if指令(二)
  2. 单点登录系统和CAS的简介
  3. 实现Redis用户会话 - 2
  4. 任务调度之Quartz1
  5. 斗地主案例的需求分析
  6. 配置解决中文乱码的过滤器
  7. tomcat_部署项目的方式
  8. 静态static关键字修饰成员变量
  9. 模拟实现顺序表ArrayList1(三级)
  10. 计算机网络按信号频带占用方式,[大学计算机应用基础第六章计算机网络基础.ppt...