点击打开题目

看到这道题,第一感觉是我有一句m2p不知当讲不当讲

传送门就算了,你提莫还来宝石,还不给我每种最多有几个~~

在一般的迷宫问题里,无论已经走了多少步,只要到达同一个点,状态便是等价的,但在这道题中,当持有不同种类宝石到达同一个地方,可能对结果会有影响,那就在BFS的地图中多开一维,来存宝石的状态

200·200的地图,DFS就算了,但BFS宝石的状态怎么办?

细看一下,宝石只有五种,凑齐k种不计个数,就可救出公主

用二进制五位,即十进制32即可解决,二进制中的每一位表示一种宝石是否获得

代码实现,就看自己的修行了,反正我写完时,第一感觉是我有一句m2p现在就要讲

代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<queue>
  5. #include<algorithm>
  6. using namespace std;
  7. struct node{int x,y,dmt,step;};
  8. queue<node>Q;
  9. int m,n,k;
  10. bool v[201][201][32];
  11. int map[201][201],u[4]={-1,1,0,0},z[4]={0,0,-1,1};
  12. int d[11][2],dcnt,xz,yz;
  13. int getint()
  14. {
  15. int num=0,flag=1;char c;
  16. while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
  17. while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
  18. return num*flag;
  19. }
  20. bool check1(int s,int x)
  21. {
  22. int i;
  23. while(s&&++i)
  24. {
  25. if(s&1&&i==x)return 1;
  26. s/=2;
  27. }
  28. return 0;
  29. }
  30. bool check2(int s)
  31. {
  32. int z=0;
  33. while(s)z+=(s&1),s/=2;
  34. if(z>=k)return 1;
  35. return 0;
  36. }
  37. int main()
  38. {
  39. int tt=getint(),i,j;
  40. char c;
  41. while(tt--)
  42. {
  43. memset(v,0,sizeof v);memset(map,0,sizeof map);
  44. memset(d,0,sizeof d);dcnt=0;
  45. while(!Q.empty())Q.pop();
  46. m=getint(),n=getint(),k=getint();
  47. for(i=1;i<=m;i++)for(j=1;j<=n;j++)
  48. {
  49. c=getchar();
  50. if(c=='\n'){j--;continue;}
  51. if(c=='#')map[i][j]=-1;
  52. if(c>='0'&&c<='9')map[i][j]=c-47;
  53. if(c=='$')d[++dcnt][0]=i,d[dcnt][1]=j,map[i][j]=6;
  54. 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;}
  55. if(c=='E')xz=i,yz=j;
  56. }
  57. while(!Q.empty())
  58. {
  59. node t=Q.front();Q.pop();
  60. for(i=0;i<4;i++)
  61. 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)
  62. {
  63. node w;w.x=t.x+u[i],w.y=t.y+z[i],w.dmt=t.dmt,w.step=t.step+1;
  64. if(map[w.x][w.y]==6)
  65. for(j=1;j<=dcnt;j++)
  66. if(!v[d[j][0]][d[j][1]][w.dmt])
  67. {
  68. node hh;
  69. hh.x=d[j][0],hh.y=d[j][1],hh.dmt=w.dmt,hh.step=w.step;
  70. Q.push(hh);
  71. }
  72. if(!map[w.x][w.y]&&!v[w.x][w.y][w.dmt])
  73. v[w.x][w.y][w.dmt]=1,Q.push(w);
  74. if(map[w.x][w.y]>0&&map[w.x][w.y]<6)
  75. {
  76. if(!check1(w.dmt,map[w.x][w.y]))w.dmt+=int(pow(2*1.0,map[w.x][w.y]-1));
  77. if(!v[w.x][w.y][w.dmt])
  78. {
  79. v[w.x][w.y][w.dmt]=1;
  80. Q.push(w);
  81. }
  82. }
  83. if(w.x==xz&&w.y==yz)
  84. if(check2(w.dmt))
  85. {printf("%d\n",w.step);goto hehe;}
  86. }
  87. }
  88. printf("oop!\n");
  89. hehe:;
  90. }
  91. }

openjudge 拯救公主的更多相关文章

  1. 【OpenJudge 8463】Stupid cat & Doge

    http://noi.openjudge.cn/ch0204/8463/ 挺恶心的一道简单分治. 一开始准备非递归. 大if判断,后来发现代码量过长,决定大打表判断后继情况,后来发现序号不对称. 最后 ...

  2. 【OpenJudge 191】【POJ 1189】钉子和小球

    http://noi.openjudge.cn/ch0405/191/ http://poj.org/problem?id=1189 一开始忘了\(2^{50}\)没超long long差点写高精度Q ...

  3. 【OpenJudge 1665】完美覆盖

    http://noi.openjudge.cn/ch0405/1665/?lang=zh_CN 状压水题,手动转移 #include<cstdio> #include<cstring ...

  4. 【OpenJudge 1793】矩形覆盖

    http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...

  5. OpenJudge 2990:符号三角形 解析报告

    2990:符号三角形 总时间限制:  1000ms       内存限制:  65536kB 描述 符号三角形的第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“ ...

  6. OpenJudge 7624 山区建小学

    在openjudge似乎无法凭题号搜到题...? 总时间限制:  1000ms  内存限制:  65536kB 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任 ...

  7. [OpenJudge 3066]随机序列

    [OpenJudge 3066]随机序列 试题描述 Bob喜欢按照如下规则生成随机数: 第一步:令a[0] = S, 当n = 0: 第二步:a[n+1] = (a[n]*A+B)%P: 第三步:如果 ...

  8. [OpenJudge 3064]坠落的蚂蚁

    [OpenJudge 3064]坠落的蚂蚁 试题描述 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续 ...

  9. [OpenJudge 3063]罪犯问题

    [OpenJudge 3063]罪犯问题 试题描述 一天,警官抓获了N个嫌犯,审问N个罪犯的途中,作为警长助手的你突然发现其中被确定为罪犯的K号人是你曾经出生入死的兄弟,你不能眼睁睁看着他被抓进牢里. ...

随机推荐

  1. [板子]用线段树解决ST表问题

    ST表可以参考:http://blog.csdn.net/whistlena/article/details/52191463 简单说就是区间RMQ最值问题. 对解决这种问题,线段树不用用啥啊. 扔一 ...

  2. The Zen of Python —— Python 之禅

    Beautiful is better than ugly.   # 优美好于丑陋(Python以编写优美的代码为目标) Explicit is better than implicit.   # 明 ...

  3. ABP运行Login failed for user 'IIS APPPOOL XXXXX Reason: Could not find a login matching the name provided问题解决

    我们在ABP官网上面生成解决方案后,编译完成,将数据库连接字符串中的Ip改成自己的测试数据库Ip直接在Vs里面调试运行没有任何问题. 发布之后到文件夹后运行,就报如下图异常. VS里面可以跑起来,单独 ...

  4. lumen 笔记一

    可以用config()函数和evn()函数来获取 .evn里面的配置内容 config('app.timezone') 获取配置config(['app.timezone' => 'China/ ...

  5. Keras cnn 手写数字识别示例

    #基于mnist数据集的手写数字识别 #构造了cnn网络拟合识别函数,前两层为卷积层,第三层为池化层,第四层为Flatten层,最后两层为全连接层 #基于Keras 2.1.1 Tensorflow ...

  6. Sybase commands

    (1)update table statistics $table name if we change index info for a table ,such as create or drop i ...

  7. basedir的介绍

    os内置dirname方法就是文件目录的往上找一级 #得到当前文件名或者路径 if __name__ == "__main__": print(__file__) #这是os的一个 ...

  8. scrf 原理及flask-wtf防护

    了解什么是scrf? SCRF跨站点请求伪造Cross—Site Request Forgery) 指恶意用户通过个人用户的点击,然而盗用用户的账号信息,并发送邮件.虚拟货币的转账,以及一些重要的事务 ...

  9. DEVOPS技术实践_22:根据参数传入条件控制执行不同stage

    前面学习了参数的传递和调用,下面研究一下根据参数作为条件执行不同的stage 使用叫when 和expression控制某一个stage的运行, 运行场景例如写了多个stage,这个pipeline脚 ...

  10. 学习python库:elasticsearch-py

    一.介绍 elasticsearch-py是一个官方提供的low-level的elasticsearch python客户端库.为什么说它是一个low-level的客户端库呢?因为它只是对elasti ...