openjudge 拯救公主
看到这道题,第一感觉是我有一句m2p不知当讲不当讲
传送门就算了,你提莫还来宝石,还不给我每种最多有几个~~
在一般的迷宫问题里,无论已经走了多少步,只要到达同一个点,状态便是等价的,但在这道题中,当持有不同种类宝石到达同一个地方,可能对结果会有影响,那就在BFS的地图中多开一维,来存宝石的状态
200·200的地图,DFS就算了,但BFS宝石的状态怎么办?
细看一下,宝石只有五种,凑齐k种不计个数,就可救出公主
用二进制五位,即十进制32即可解决,二进制中的每一位表示一种宝石是否获得
代码实现,就看自己的修行了,反正我写完时,第一感觉是我有一句m2p现在就要讲
代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
struct node{int x,y,dmt,step;};
queue<node>Q;
int m,n,k;
bool v[201][201][32];
int map[201][201],u[4]={-1,1,0,0},z[4]={0,0,-1,1};
int d[11][2],dcnt,xz,yz;
int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
bool check1(int s,int x)
{
int i;
while(s&&++i)
{
if(s&1&&i==x)return 1;
s/=2;
}
return 0;
}
bool check2(int s)
{
int z=0;
while(s)z+=(s&1),s/=2;
if(z>=k)return 1;
return 0;
}
int main()
{
int tt=getint(),i,j;
char c;
while(tt--)
{
memset(v,0,sizeof v);memset(map,0,sizeof map);
memset(d,0,sizeof d);dcnt=0;
while(!Q.empty())Q.pop();
m=getint(),n=getint(),k=getint();
for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{
c=getchar();
if(c=='\n'){j--;continue;}
if(c=='#')map[i][j]=-1;
if(c>='0'&&c<='9')map[i][j]=c-47;
if(c=='$')d[++dcnt][0]=i,d[dcnt][1]=j,map[i][j]=6;
if(c=='S'){node t;t.x=i,t.y=j,t.dmt=0,t.step=0;Q.push(t);v[i][j][0]=1;}
if(c=='E')xz=i,yz=j;
}
while(!Q.empty())
{
node t=Q.front();Q.pop();
for(i=0;i<4;i++)
if(map[t.x+u[i]][t.y+z[i]]!=-1&&t.x+u[i]>0&&t.x+u[i]<=m&&t.y+z[i]>0&&t.y+z[i]<=n)
{
node w;w.x=t.x+u[i],w.y=t.y+z[i],w.dmt=t.dmt,w.step=t.step+1;
if(map[w.x][w.y]==6)
for(j=1;j<=dcnt;j++)
if(!v[d[j][0]][d[j][1]][w.dmt])
{
node hh;
hh.x=d[j][0],hh.y=d[j][1],hh.dmt=w.dmt,hh.step=w.step;
Q.push(hh);
}
if(!map[w.x][w.y]&&!v[w.x][w.y][w.dmt])
v[w.x][w.y][w.dmt]=1,Q.push(w);
if(map[w.x][w.y]>0&&map[w.x][w.y]<6)
{
if(!check1(w.dmt,map[w.x][w.y]))w.dmt+=int(pow(2*1.0,map[w.x][w.y]-1));
if(!v[w.x][w.y][w.dmt])
{
v[w.x][w.y][w.dmt]=1;
Q.push(w);
}
}
if(w.x==xz&&w.y==yz)
if(check2(w.dmt))
{printf("%d\n",w.step);goto hehe;}
}
}
printf("oop!\n");
hehe:;
}
}
openjudge 拯救公主的更多相关文章
- 【OpenJudge 8463】Stupid cat & Doge
http://noi.openjudge.cn/ch0204/8463/ 挺恶心的一道简单分治. 一开始准备非递归. 大if判断,后来发现代码量过长,决定大打表判断后继情况,后来发现序号不对称. 最后 ...
- 【OpenJudge 191】【POJ 1189】钉子和小球
http://noi.openjudge.cn/ch0405/191/ http://poj.org/problem?id=1189 一开始忘了\(2^{50}\)没超long long差点写高精度Q ...
- 【OpenJudge 1665】完美覆盖
http://noi.openjudge.cn/ch0405/1665/?lang=zh_CN 状压水题,手动转移 #include<cstdio> #include<cstring ...
- 【OpenJudge 1793】矩形覆盖
http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...
- OpenJudge 2990:符号三角形 解析报告
2990:符号三角形 总时间限制: 1000ms 内存限制: 65536kB 描述 符号三角形的第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“ ...
- OpenJudge 7624 山区建小学
在openjudge似乎无法凭题号搜到题...? 总时间限制: 1000ms 内存限制: 65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任 ...
- [OpenJudge 3066]随机序列
[OpenJudge 3066]随机序列 试题描述 Bob喜欢按照如下规则生成随机数: 第一步:令a[0] = S, 当n = 0: 第二步:a[n+1] = (a[n]*A+B)%P: 第三步:如果 ...
- [OpenJudge 3064]坠落的蚂蚁
[OpenJudge 3064]坠落的蚂蚁 试题描述 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续 ...
- [OpenJudge 3063]罪犯问题
[OpenJudge 3063]罪犯问题 试题描述 一天,警官抓获了N个嫌犯,审问N个罪犯的途中,作为警长助手的你突然发现其中被确定为罪犯的K号人是你曾经出生入死的兄弟,你不能眼睁睁看着他被抓进牢里. ...
随机推荐
- Priest John's Busiest Day (2-sat)
题面 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...
- 【2016常州一中夏令营Day3】
小 W 摆石子[问题描述]小 W 得到了一堆石子,要放在 N 条水平线与 M 条竖直线构成的网格的交点上.因为小 M 最喜欢矩形了,小 W 希望知道用 K 个石子最多能找到多少四边平行于坐标轴的长方形 ...
- Arcgis api for javascript学习笔记(3.2版本) - 匀速行驶轨迹动画效果
一.前言 有这样一个需求:已知某条线上的n个点的经纬度数组 ,实现物体运行轨迹. 如果这些点中两个距离很近,那么我们可以用一个定时器在地图上每次重新画一个点,这样肉眼看到这个点上的运动效果,如下图代码 ...
- linux中inode的理解
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...
- 最近邻分类器,K近邻分类器,线性分类器
转自:https://blog.csdn.net/oldmao_2001/article/details/90665515 最近邻分类器: 通俗来讲,计算测试样本与所有样本的距离,将测试样本归为距离最 ...
- 基于 HTML5 + WebGL 的无人机 3D 可视化系统
前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的 ...
- 如何看Crash 文件
如何查看崩溃日志 好了,获得是人类可读语言的崩溃日志后,或者是从别人手机到处崩溃日志后,下一步就是查看了.下面就正对一个程序猿该如何看稍微说说. 崩溃日志头 1 2 3 4 5 6 7 8 9 ...
- 使用element的upload组件实现一个完整的文件上传功能(上)
说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...
- [梁山好汉说IT] 如何理解脑裂问题
[梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...
- ELK部署检测nginx日志demo
ELK E: ElasticSearch 搜索引擎 存储 https://www.elastic.co/cn/downloads/elasticsearch L: Logstash 日志收集 http ...