2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

  1 /*
  2     这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态!
  3     以前做过的都是用二维的!自己的四维还是太狭隘了.....
  4     
  5     题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到!
  6     每种钥匙有 k 种, 每一种有多个! 只要求找到每一种的其中一个就可以!
  7     找钥匙的顺序按照 第1种, 第2种, 第3种 ....第k种! 
  8     找钥匙的时间是一步, 走到相邻空地的时间是一步, 打蛇的时间就是两步!
  9     求找到师傅的最少步数! 
 10     
 11     这里说一下 state[N][N][10][35]表示的含义: ->state[x][y][i][j] 
 12     前两维就不用说了,就是地图上的坐标, 第三维表示的是当前找到第几把钥匙
 13     第四维表示的沿着一条路径走到 (x, y)找到 第 i 把钥匙打掉了哪几条蛇!
 14     将 j 拆分成 二进制, 从右往左数, 如果第 k 为是1, 表示第 k 条 蛇杀掉了! 
 15 */ 
 16 
 17 #include<iostream>
 18 #include<cstdio>
 19 #include<cstring>
 20 #include<algorithm>
 21 #include<queue>
 22 
 23 #define N 105
 24 using namespace std;
 25 
 26 char mp[105][105];
 27 
 28 bool state[N][N][10][35];
 29 
 30 int bx, by;
 31 
 32 struct node{
 33     int x, y;
 34     int numk, snk;
 35     int step;
 36     node(){}
 37     
 38     node(int x, int y, int numk, int snk, int step){
 39         this->x = x;
 40         this->y = y;
 41         this->numk = numk;
 42         this->snk = snk;
 43         this->step = step;
 44     }
 45 };
 46 
 47 int n, m;
 48 int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
 49 bool operator < (node a, node b) {
 50     return a.step > b.step;
 51 }
 52 
 53 priority_queue<node>q;
 54 
 55 bool bfs(){
 56     while(!q.empty()) q.pop();
 57     memset(state, false, sizeof(state));
 58     q.push( node(bx, by, 0, 0, 0) );
 59     state[bx][by][0][0] = true;
 60     while( !q.empty() ) {
 61         node cur = q.top();
 62         q.pop();
 63         for(int i=0; i<4; ++i){
 64             int x = cur.x + dir[i][0];
 65             int y = cur.y + dir[i][1];
 66             if(x<1 || x>n || y<1 || y>n || mp[x][y]=='#') continue;
 67             int numk = cur.numk, snk = cur.snk, step = cur.step;
 68             if(mp[x][y] == '.')
 69                 step += 1;
 70             else if( mp[x][y] >= '1' && mp[x][y] <= '9'){
 71                 if( numk + 1 == mp[x][y] - '0' )
 72                     numk += 1;
 73                 step += 1;
 74             }
 75             else if( mp[x][y] >= 'A' && mp[x][y] <= 'E' ){//这一步是关键 
 76                 int cnt = mp[x][y] - 'A' + 1; 
 77                 if(    (1 << (cnt-1) ) & snk ) step += 1;//如果这一条蛇已经被打过了,也就是一条路又折回到这一个点 
 78                 else{//在这一条路上,这条蛇没有被打过,那就将它打掉,并标记这条蛇打过了! 
 79                     step += 2;
 80                     snk ^= ( 1 << (cnt-1) );
 81                 }
 82             }
 83             else if( mp[x][y] == 'T' && numk == m ){
 84                 printf("%d\n", step + 1);
 85                 return true;
 86             }
 87             else step += 1;
 88             
 89             if( state[x][y][numk][snk] )  continue;
 90             state[x][y][numk][snk] = true;
 91             q.push( node(x, y, numk, snk, step) );
 92         }
 93     }
 94     return false;
 95 }
 96 
 97 int main(){
 98     while( scanf("%d%d", &n, &m) && (n ||m) ) {
 99         int cntS = 0;
100         for(int i = 1; i <= n; ++ i){
101             scanf("%s", mp[i] + 1);
102             for(int j = 1; j <=n; ++ j)
103                 if(mp[i][j] == 'K'){
104                     bx = i;
105                     by = j;
106                 }
107                 else if(mp[i][j] == 'S')
108                     mp[i][j] = 'A' + cntS++;
109         }
110         if( !bfs() )  printf("impossible\n");
111     }
112     return 0;
113 }

 

转载于:https://www.cnblogs.com/hujunzheng/p/3984954.html

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

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

相关文章

oracle move 换用户,Oracle move方法释放delete后的表空间

在新增记录时,高水位线会慢慢往上移,但是在删除记录后,高水位线却不会往下移。在使用delete from命令删除大量数据时会导致因HWM引起的性能问题。删除高水位的最直接的方法是truncate Table。-----Oracle 频繁delete表空间无法释放&#xff0c;释放表空间方法&#xff0c;清除…

oracle 字段除以1000,ORACLE常用}1000(之一)_oracle

大家在oracle的r候可能龅胶芏嗫雌聿浑y的}, 特eπ率碚f, 今天我伟阉Y一下, l布o大家, 希望Υ蠹矣助! 和大家一起探, 共同M步!     ORACLE高手碚f是不用看的. 1. Oracle安b完成后的初始口令?   internal/oracle   sys/change_on_install   system/manager   scott/…

java中图片文件的判断

javax.imageio 类 ImageIO BufferedImage bi ImageIO.read(resFile);//resFile --- InputStreamif(bi null){ System.out.println(此文件不为图片文件); }try {//判断是否为图片文件并且返回图片的格式&#xff01;ImageInputStream iis ImageIO.createImageInputStream(o)…

oracle 查看数据库性能,oracle 11G使用statspack查看数据库的性能

1.安装Statspack工具(statspack工具的脚本在$ORACLE_HOME/rdbms/admin目录下,全是以sp开头的文件)[oracleoracle ~]$ sqlplus / as sysdbasql> select file_name,tablespace_name from dba_data_files;FILE_NAMETABLESPACE_NAME-------------------------------------------…

java中JTextPane使输出字符到指定的宽度换行,并将垂直滚动条的位置移动到输出的最后位置...

SimpleAttributeSet set new SimpleAttributeSet();Document doc tp.getStyledDocument(); FontMetrics fm tp.getFontMetrics(tp.getFont());//得到JTextPane 的当前字体尺寸int paneWidth tp.getWidth();//面板的宽度String text new String(bt, 0, len);  try{for(int…

oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化

Oracle Rac 修改SGA_TARGET值无变化发布时间&#xff1a;2020-08-13 23:02:13来源&#xff1a;ITPUB博客阅读&#xff1a;93作者&#xff1a;dmcatding系统&#xff1a;Red Hat Enterprise Linux Server release 6.4 (Santiago)数据库&#xff1a;Oracle 11.2.0.4.1710171、 al…

codeforces George and Job

1 /*2 题意&#xff1a;给一个长度为n的序列&#xff0c; 从中选择长度为m的k个区间&#xff08;任意两个区间不会有公共部分&#xff09;3 使得所选择的区间的和最大&#xff01;4 思路&#xff1a;这是一种很常见的dp5 6 dp[i][j] 表示的是前 i 个数选择…

oracle表空间 设置,Oracle表空间怎么设置和管理

前言表空间是 Oracle 特有的一种逻辑结构&#xff0c;是管理和组织 Oracle 数据文件一种方式&#xff0c;一个Oracle 数据库能够有一个或多个表空间&#xff0c;而一个表空间则对应一个或多个物理的数据库文件。Oracle 的表空间分为永久空间和临时表空间&#xff0c;同时又分为…

2014 网选 5024 Wang Xifeng's Little Plot

题意&#xff1a;从任意一个任意一个可走的点开始找一个最长的路&#xff0c;这条路如果有转弯的话&#xff0c; 那么必须是 90度&#xff0c;或者没有转弯&#xff01; 思路&#xff1a; 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 &#xff01; step[i][…

aix升级新安装oracle,AIX 5L上安装和升级Oracle

1、检查环境检查硬件与OS位数&#xff0c;一定确保64bit#bootinfo -y64#bootinfo -K64检查内存大小&#xff0c;至少需要512M以上#/usr/sbin/lsattr -E -l sys0 -a realmemrealmem 12582912 Amount of usable physical memory in Kbytes False 临时目录的大小&#xff0c;至少5…

Adobe InDesign各版本安装指南

下载链接 https://pan.baidu.com/s/11sTpMUbQEXhyjpkBlixcLg?pwd0531 #2024版 1.鼠标右击【Ai2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Ai2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

java中如何将JScrollPane的垂直滚动条自动移动到最下端

JPanel QQP new JPanel();              JScrollPane jsp new JScrollPane(QQP);              JScrollBar jsb jsp.getVerticalScrollBar();QQP.updateUI();//利用当前外观的值重置 UI 属性。 也可以保证滚动条随时的更新//终于搞好了&#xf…

codeforces MUH and Important Things

/*   题意&#xff1a;给一个序列&#xff0c;表示每一项任务的难度&#xff0c;要求完成每一项任务的循序是按照难度由小到大的&#xff01;输出三种符合要求的工作顺序的序列&#xff01;   思路&#xff1a;直接看代码.... */ 1 #include<iostream>2 #include<…

oracle11g ogg报价,Oracle11g GoldenGate配置错误OGG-00868 Attaching to ASM server

GGSCI (CBDBS01) 9> start eiexaa错误&#xff1a;2011-02-24 10:32:45 ERROR OGG-00868 Oracle GoldenGate Capture for Oracle, eiexaa.prm: Attaching to ASM server CBOMS:1568/ASM1: (12154) ORA-12154: TNS:could not resolve the connect identifier specified.…

Linux启动更新命令,Linux更新和查询命令chkconfig详细介绍

chkconfig在Linux下是管理服务/启动项在各个系统运行级别中的设置&#xff0c;在Linux中系统有7个运行级别&#xff0c;分别是&#xff1a;1.运行级别0&#xff1a;表示关机2.运行级别1&#xff1a;表示单用户模式3.运行级别2&#xff1a;无网络连接的多用户命令行模式4.运行级…

怎样永久更改嵌入式linux系统ip,如何修改嵌入式系统IP

如何修改嵌入式系统IP(2012-06-05 01:36:56)标签&#xff1a;嵌入式如何杂谈如何修改嵌入式系统IP我的嵌入式设备的根文件系统是用busybox作的&#xff0c;现在我想在程序里面更改它的IP地址等网络信息&#xff0c;但是没有找到方法&#xff0c;希望有知道的给我帮助&#xff0…

codeforces MUH and Cube Walls

题意&#xff1a;给定两个序列a ,b, 如果在a中存在一段连续的序列使得 a[i]-b[0]k, a[i1]-b[1]k.... a[in-1]-b[n-1]k 就说b串在a串中出现过&#xff01;最后输出b串在a串中出现几次&#xff01; 思路&#xff1a; KMP变形&#xff01;如何转换成KMP求解呢&#xff1f; 举一个例…

linux release 版本的区别,编译debug版本和编译release版本的区别

大项目的版本编译会区别debug和release&#xff0c;那debug和release会有什么区别呢&#xff1f;通过对比这两者的编译选项可以找到答案。1.对比编译过程debug:-DOS_LINUX -DDEBUG_VERSION -fno-builtin -pipe -Wall -fsigned-char -g-mlongcall -DCPUPPC85XX -mcpu8548 -m…

java模仿qq好友面板的布局(BoxLayout问题)

..............JLabel ll new JLabel(dlg.getNameText() ":" dlg.getIPText(), ii[index], JLabel.LEFT);tmp new JPanel();//将标签添加到这个面板中tmp.setLayout(new FlowLayout(FlowLayout.CENTER));tmp.setBackground(new Color(255, 0, 255));/** BoxLayo…

linux apple开发环境,Objective-C开发环境设置

如果要安装自己的Objective-C编程语言编程环境&#xff0c;则需要在计算机上安装文本编辑器和GCC编译器。1. 文本编辑器文本编辑器用于编写程序代码。一些常见的编辑器如&#xff1a;Windows Notepad&#xff0c;OS Edit命令&#xff0c;Brief&#xff0c;Epsilon&#xff0c;E…