HDU 5025Saving Tang Monk BFS + 二进制枚举状态

3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间。

第二次WA,是因为没有枚举蛇的状态。

 

解体思路:

因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可。

然后多次BFS,先从起点到第一把钥匙,不能往回走,要用VIS数组标记。

第二次从第一把钥匙走到第二把钥匙。

最后一次从最后一把钥匙走到终点即可。

 

Tips 1: 在每次BFS过程中使用优先队列保证每次是最小步长的状态。

Tips2 :使用二进制枚举蛇的状态

Tips3:首先使用DFS判断是否绝对有解,如果无解输出"impossible",如果有解则继续。

Tips4:多次 BFS,而不是一次BFS,否则会导致状态太多TLE

 

代码如下:

  1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
  2 #include <stdio.h>
  3 #include <iostream>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <stack>
  7 #include <queue>
  8 #include <vector>
  9 #include <algorithm>
 10 #define ll long long
 11 #define Max(a,b) (((a) > (b)) ? (a) : (b))
 12 #define Min(a,b) (((a) < (b)) ? (a) : (b))
 13 #define Abs(x) (((x) > 0) ? (x) : (-(x)))
 14 using namespace std;
 15 
 16 const int INF = 0x3f3f3f3f;
 17 const int MAXN = 220;
 18 const double eps = 1e-9;
 19 
 20 struct node{
 21     int x,y,step;
 22 };
 23 
 24 char map[105][105];
 25 int vis[105][105];
 26 int to[4][2]= {1,0,-1,0,0,1,0,-1};
 27 int n,m,sx,sy,ex,ey,ans;
 28 
 29 bool operator < (node a, node b){
 30     return a.step > b.step;
 31 }
 32 
 33 int check(int x,int y){
 34     if(x<0 || x>=n || y<0 || y>=n)
 35         return 1;
 36     if(map[x][y]=='#' || vis[x][y])
 37         return 1;
 38     return 0;
 39 }
 40 
 41 void bfs(int sx, int sy, int k){
 42     int i;
 43     priority_queue <node> Q;
 44     node a,next;
 45     a.x = sx;
 46     a.y = sy;
 47     a.step = 0;
 48     vis[a.x][a.y]=1;
 49     Q.push(a);
 50     while(!Q.empty()){
 51         a = Q.top();
 52         //printf("x = %d y = %d step = %d\n",a.x,a.y,a.step);
 53         Q.pop();
 54         if(k <= m){
 55             if(map[a.x][a.y] == k + '0'){
 56                 ans += a.step;
 57                 ex = a.x;
 58                 ey = a.y;
 59                 //printf("%d %d cur _ ans = %d\n",ex, ey,ans);
 60                 return;
 61             }
 62         } else{
 63             if(map[a.x][a.y] == 'T'){
 64                 ans += a.step;
 65                 ex = a.x;
 66                 ey = a.y;
 67                 //printf("%d %d cur _ ans = %d\n",ex, ey,ans);
 68                 return;
 69             }
 70         }
 71         for(i = 0; i<4; i++){
 72             next = a;
 73             next.x+=to[i][0];
 74             next.y+=to[i][1];
 75             if(check(next.x,next.y))    continue;
 76             next.step=a.step+1;
 77             if(map[a.x][a.y] == 'S'){
 78                 ++next.step;
 79             }
 80             vis[next.x][next.y] = 1;
 81             Q.push(next);
 82         }
 83         if(map[a.x][a.y] == 'S'){
 84             map[a.x][a.y] = '.';
 85         }
 86     }
 87     ans =INF;
 88     return ;
 89 }
 90 
 91 void dfs(int x, int y){
 92     for(int i = 0; i<4; i++){
 93             int _x = x + to[i][0];
 94             int _y = y + to[i][1];
 95             if(check(_x,_y))  continue;
 96             if(map[_x][_y] != '#'){
 97                 vis[_x][_y] = 1;
 98                 dfs(_x,_y);
 99             }
100     }
101 }
102 int main(){
103     int i,j,cc,s_flag;
104     while(EOF != scanf("%d%d",&n,&m)){
105         if(n == 0 && m == 0)    break;
106         s_flag = 0;
107         node S[6];
108         for(i = 0; i<n; i++)
109             scanf("%s",map[i]);
110         for(i = 0; i<n; i++){
111             for(j = 0; j<n; j++){
112                 if(map[i][j]=='K'){
113                     sx = i;
114                     sy = j;
115                 }else if(map[i][j] == 'T'){
116                     ex = i,ey = j;
117                 }else if(map[i][j] == 'S'){
118                     S[s_flag].x = i, S[s_flag++].y = j;
119                 }
120             }
121         }
122         memset(vis,0,sizeof(vis));
123         vis[sx][sy] = 1;
124         dfs(sx,sy);
125         int kkk[11];
126         bool flag = false;
127         memset(kkk, 0, sizeof(kkk));
128         for(i = 0; i < n; ++i){
129             for(j = 0; j < n; ++j){
130                 if(map[i][j] >= '1' && map[i][j] <= '9' && vis[i][j]){
131                     kkk[map[i][j] - '0'] = 1;
132                 }
133             }
134         }
135         for(i = 1; i <= m; ++i){
136             if(!kkk[i]) break;
137         }
138         if(i == m + 1)  flag = true;
139 
140         if(vis[ex][ey] == 0 || !flag){
141              printf("impossible\n");
142              continue;
143         }
144         s_flag = 0;
145         for(i = 0; i<n; i++){
146                 for(j = 0; j<n; j++){
147                     if(map[i][j] == 'S'){
148                         S[s_flag].x = i, S[s_flag++].y = j;
149                     }
150                 }
151         }
152         int minans=INF;
153         for(cc = 0; cc < (1 << s_flag); ++cc){
154             ans = 0;
155             for(i = 0; i <s_flag; ++i){
156                 if((1 << i) & cc){
157                     map[S[i].x][S[i].y] = '.';
158                     ans++;
159                 }
160                 else {
161                     map[S[i].x][S[i].y] = '#';
162                 }
163             }
164             for(i = 0; i < n; ++i){
165                 for(j = 0; j < n; ++j){
166                     if(map[i][j] == 'K'){
167                         ex = i;
168                         ey = j;
169                     }
170                 }
171             }
172             for(int k = 1; k <= m + 1; ++k){
173                 memset(vis, 0, sizeof(vis));
174                 sx = ex;
175                 sy = ey;
176                 bfs(sx, sy, k);
177             }
178             minans=min(minans,ans);
179         }
180         printf("%d\n",minans);
181     }
182     return 0;
183 }

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3988246.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible模块之yum、pip、service、corn、user、group

ansible相关模块 yum rpm 和yum 的区别 rpm&#xff1a;全称redhat package manager &#xff08;红帽包管理器&#xff09; 不能解决包之间的依赖关系 yum&#xff1a;可以解决依赖关系yum 源配置[rootlocalhost ~]# cat /etc/yum.repos.d/epel.repo [epel] nameExtra Package…

linux nuttx 环境搭建,ubuntu14.04 nuttx开发环境的搭建

origin: http://blog.csdn.net/hunter168_wang/article/details/529145451. NUTTX编译用 toolchain的下载与配置开发环境&#xff1a;64位Ubuntu 14.04 系统编译NuttX用的toolchain下载地址&#xff1a;https://launchpadlibrarian.net/268330503/gcc-arm-none-eabi-5_4-2016q2…

Elasticsearch-kopf导览

当我需要一个插件来显示Elasticsearch的集群状态时&#xff0c;或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议&#xff0c;而且似乎是非官方的继任者&#xff0c;所以我最近对elasticsearch-kopf进行了更详细的介绍 。 我喜欢它。 我不确…

文字阴影-CSS Text-Shadow

1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2<html xmlns"http://www.w3.org/1999/xhtml">3<head>4<title>文字阴影-CSS Text-Shad…

javascript动态创建radio button元素支持IE/Firefox

我们都知道在IE中创建表单元素可以有三种方式varoInput document.createElement("input");varoInput document.createElement("<input />");varoInput document.createElement("<input name />");在Firefox里面仅支持varoInput docu…

C# 只允许运行一个程序实例

using System; using System.Windows.Forms; using System.Runtime.InteropServices;//使用DllImport的必须。 using System.Diagnostics;//引入Process 类namespace 命名空间 {static class Program{private const int WS_SHOWNORMAL 1;[DllImport("User32.dll")]p…

如何在Android Studio中添加RecyclerView-v7支持包

首先右键你的项目然后选择 open module Settings 之后会出现这个界面&#xff0c;选择 Modules 下的app ,>>> Dependencies >>>点击右边的“” 选择第一项Library dependency 出现此界面&#xff0c;然后选择你所需要的 转载于:https://www.cnblogs.com/lcx9…

linux 时间会跳吗,linux系统时间暂时跳跃

此脚本将告诉您何时发生时间漂移以及进程树中的差异,如果这是由更改系统时间的进程引起的,则应该有助于识别此情况.它将打印到终端并登录到当前工作目录中的timedrift.log.#!/bin/basholdTime"$(date %s)"oldPsOutput"$(ps faux)"while true; dosleep 1;cu…

您从未听说过的Java 8的10个功能

Lambdas lambdas lambdas。 这是您在谈论Java 8时所听到的所有信息。但这只是一部分。 Java 8具有许多新功能-有些是功能强大的新类和习惯用语&#xff0c;而另一些则是从一开始就应该存在的功能。 我想介绍十个新功能&#xff0c;我认为这些功能绝对是值得了解的小宝石。 您肯…

浮动层图片鼠标指针移到自动放大

html code:1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2<html xmlns"http://www.w3.org/1999/xhtml">3<head>4<title>缔友计算机信…

透明的iframe

<iframe allowtransparency"true" src"about: " οnlοad"style.display block;"> 只要是两个属性&#xff1a; 1&#xff09; allowtransparency"true" 2&#xff09; src"about: " 或iframe 的风页设置成 在IE下…

koa2 mongdb 做后端接口的小demo

现在前端全栈里面有一种技术栈比较火 前端使用 vue 或者react 后端使用 koa2 mysql数据库 或者mongdb做数据储存 但是基本这样的全栈教程 都要收费 收费就收费吧 但是 有没有遇到非常好的教程 于是 准备硬着头皮看别人项目的源码 自己摸索 一步一步完成 koa mongdb的后端学习…

字符大小端aix linux,long, unsigned long不是跨平台的(慎用)

项目中用到long、long long等字段&#xff0c;遇到一些问题。先说得到的一些结论&#xff1a;大小端&#xff1a;Windows、Linux是小端&#xff0c;AIX是大端。sizeof(指针类型)程序位数/8。long、unsigned long不是跨平台的&#xff0c;一定要慎用。自己写了程序测试各平台下(…

Java构建工具:Ant vs. Maven vs Gradle

最初&#xff0c;Make是唯一可用的构建工具。 后来通过GNU Make进行了改进。 但是&#xff0c;从那时起&#xff0c;我们的需求增加了&#xff0c;结果&#xff0c;构建工具也不断发展。 JVM生态系统主要由三个构建工具组成&#xff1a; 常春藤的 Apache Ant 马文 摇篮 An…

redis问题与解决思路

问题现象&#xff1a; 集群状态 1主 2从&#xff0c;主没有开启bgsave&#xff0c;从开启bgsave。现象所有redis可以访问&#xff0c;进行操作。主不断开始bgsave 1从停止bgsave。 主日志报错# Connection with slave XXXX lost. 从日志报错# Timeout receiving bulk data from…

Asp.Net中用javascript实现弹出窗口永远居中

//Asp.Net中用javascript实现弹出窗口永远居中functionShowDialog(url) { var iWidth600; //模态窗口宽度 var iHeight500;//模态窗口高度 var iTop(window.screen.height-iHeight)/2; var iLeft(window.screen.width-iWidth)/2; window.open(url,"Detail"…

Linux Vim 光标错位,技术|Vim 复制粘帖格式错乱问题的解决办法

有时候&#xff0c;复制文本(尤其是代码)到 Vim&#xff0c;会出现格式错乱的问题。看样子&#xff0c;应该是自动缩进惹得祸。本文不去深究原因&#xff0c;直接给出解决方法。1. paste 模式运行如下命令&#xff0c;进入 paste 模式&#xff1a;:set paste进入 paste 模式后&…

jQuery事件机制

1 事件操作 1.1 页面载入事件 $(document).ready(function(){// 在这里写你的代码... }); 或者 $(function($) { // 你可以在这里继续使用$作为别名... }); 1.2 事件绑定 on(eve,[sel],[data],fn) 1.7 在选择元素上绑定一个或多个事件的事件处理函数 bind(type,[dat…

struts中多个模块时,使用多个struts-config.xml文件之间时如何切换的!

1.配置web.xml文件&#xff0c;通知控制器&#xff1a; <!-----------------这个是默认的--------------------------> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-valu…

关于JVM和JIT的一点点

如您所知&#xff0c;JVM&#xff08;Java Virtusal Machine&#xff09;使Java能够遵循“一次写入&#xff0c;随处运行”的范例。 JVM的核心包括以下组件&#xff1a; 堆 堆 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每个新运算符分…