NEU710(wanghang走迷宫)
题目链接:传送门
题目大意:给你一个图,要从起点走到终点并且要吃够足够的金币才能出去,图上有金币(只能吃一次),
有传送门(用一次消耗1金币,必须有金币才能使用),问最少需要多少步才能出去。不能出去输出-1
题目思路:搜索+状态压缩技巧
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 1000010
#define maxn 400005
typedef pair<int,int> PII; int n,m,k,tx,ty; ///tx ty 记录终点位置
char pic[][];
int vis[][][<<|][]; ///1,2维表示位置,第3维代表走到当前位置吃了哪些金币
int dir[][]={{,},{-,},{,},{,-}}; ///第4维代表当前有多少金币
int dx[],dy[],dcnt; ///dcnt记录有多少传送门,前两个数组记录位置
struct Node{
int x,y,v,cnt,fg; ///fg状态压缩表示当前吃了哪些金币
void ini(){ ///v代表当前有多少金币,cnt代表走了几步
v=cnt=fg=;
}
}node,temp;
void bfs(){
queue<Node>q;
q.push(node);
while(!q.empty()){
node=q.front();q.pop();
int x=node.x;int y=node.y;
if(x==tx&&y==ty){
if(node.v>=k){
printf("%d\n",node.cnt);
return;
}
continue;
}
temp=node;
if(pic[x][y]=='P'&&temp.v){ ///走到了有传送门的位置
temp.cnt++; ///并且有路费可以用传送门
temp.v--;
for(int i=;i<dcnt;++i){
if((dx[i]==x&&dy[i]==y))continue;
int xx=dx[i],yy=dy[i];
if(vis[xx][yy][temp.fg][temp.v])continue;
vis[xx][yy][temp.fg][temp.v]=;
temp.x=xx;temp.y=yy;
q.push(temp);
}
}
for(int i=;i<;++i){
temp=node;
temp.cnt++;
int xx=x+dir[i][],yy=y+dir[i][];
if(xx<||xx>n||yy<||yy>m||pic[xx][yy]=='#')continue;
if(isdigit(pic[xx][yy])){ ///走到了有金币的位置
if(temp.fg&(<<(pic[xx][yy]-''))){ ///金币已经吃过了
if(!vis[xx][yy][temp.fg][temp.v]){
vis[xx][yy][temp.fg][temp.v]=;
temp.x=xx;temp.y=yy;
q.push(temp);
}
}
else{ ///金币还没吃过
temp.fg|=(<<(pic[xx][yy]-''));
temp.v++;
if(!vis[xx][yy][temp.fg][temp.v]){
vis[xx][yy][temp.fg][temp.v]=;
temp.x=xx;temp.y=yy;
q.push(temp);
}
}
}
else{
if(!vis[xx][yy][temp.fg][temp.v]){
vis[xx][yy][temp.fg][temp.v]=;
temp.x=xx;temp.y=yy;
q.push(temp);
}
}
}
}
printf("-1\n");
}
int main(){
int i,j,group,Case=;
scanf("%d",&group);
while(group--){
int gold=;dcnt=;///gold是将'C'转换为数字,方便状态压缩
mst(vis,);
scanf("%d%d%d",&n,&m,&k);
node.ini();
for(i=;i<=n;++i){
scanf("%s",pic[i]+);
for(j=;j<=m;++j){
if(pic[i][j]=='C') pic[i][j]=''+gold++;
else if(pic[i][j]=='P'){
dx[dcnt]=i;dy[dcnt++]=j;
vis[i][j][][]=;
}
else if(pic[i][j]=='E'){
tx=i;ty=j;
}
else if(pic[i][j]=='S'){
node.x=i;node.y=j;
}
}
}
bfs();
}
return ;
}
NEU710(wanghang走迷宫)的更多相关文章
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- sdut 2449走迷宫【最简单的dfs应用】
走迷宫 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...
- 洛谷P1238 走迷宫
洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
- NYOJ306 走迷宫(dfs+二分搜索)
题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...
- Problem A: 走迷宫问题
Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...
- BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...
- P1238 走迷宫
原题链接 https://www.luogu.org/problemnew/show/P1238 为了巩固一下刚学习的广搜,练一下迷宫类型的题 不过这道题我用的深搜..... 看问题,我们就知道这道题 ...
- golang 实现广度优先算法(走迷宫)
maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...
随机推荐
- jsp 普通变量与jQuery变量之间的转换
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Tcp Ip -- tcpdump win窗口大小
问题介绍 今天,有内部模块与外部系统断连. (外部系统smgw,内部接口interface) smgw <----> interface 有消息交互. 通过tcpdump -xns0 po ...
- 使用ng-grid实现可配置的表格
使用Angularjs在带来方便的同时,也有一些遗憾:很多基于jquery或其它的组件,在angularjs中需要集成一下才能用得流畅.但是一些比较复杂的组件,集成起来的工作量相当大,比如说grid. ...
- 点滴积累【JS】---JS小功能(JS实现动态添加运动属性)
效果: 思路: 首先遍历div挨个执行onmouseover事件,再设置获取非行间样式.然后编写setInterval计时器框架,框架内容是:将三个参数 div.div属性.div的目标点,分别获得, ...
- 解决Ubuntu下博通网卡驱动问题
sudo apt-get install bcmwl-kernel-source我的无线网卡是BCM4312 802.11b/g 在12.04 会集成驱动,装完就能用,现在用14.04,16.04里面 ...
- [gj]三国攻势图
三国攻势图 参考: 估计你对三国故事有点兴趣,我给你看看图说三国(大概的):
- lantin1
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1. ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCI ...
- make命令用法--转
转自:http://www.techug.com/make 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建 ...
- Oracle之配置客户端登陆多个远程数据库
一.引言 一直搞不明白Oracle数据库的客户端是怎么回事,怎么配置,前几天由于工作中需要用到Oracle,而且需要连接两个不同的数据库,就通过上网和请教同事终于把客户端的配置搞定了,记录之,学习之 ...
- 【问题记录】shiro logout UnknownSessionException
问题描述:web项目中使用shiro做登录权限控制,当shiro执行logout后,直接返回一个jsp路径会抛出org.apache.shiro.session.UnknownSessionExcep ...