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 ...
随机推荐
- CodeIgniter 2.X 于 PHP5.6 兼容错误
本篇文章由:http://xinpure.com/codeigniter-2-x-to-php5-6-compatible-error/ CI 3.0 已兼容此问题 在代码迁移的过程中,遇到了一个 P ...
- PHP 导出 CSV 文件用 Excel 打开出现中文乱码
本篇文章由:http://xinpure.com/php-export-csv-file-opened-by-excel-appear-garbled/ 乱码情况 写了一段导出 CSV 文件的代码,可 ...
- sql 语句中 id< ;SELECT * FROM t_blog WHERE id<#{id} ORDER BY id DESC LIMIT 1
- std::vector<char> 转 const char
std::stringstream oss; for(unsigned int i=0;i < buffer->size();i++){ oss<<(*buffer)[i]; ...
- 转: python 利用EMQ实现消费者和生产者模型
消费者 """ 测试emq-消费者 @author me """ import paho.mqtt.client as mqtt impor ...
- express 创建node服务器
var express = require('express'); var app = new express(); app.listen(3000); app.get('/',function(re ...
- unity, 在surface shader中访问顶点色
//ref: Custom data computed per-vertex: http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html ...
- Redis 5种数据类型,2种特殊数据处理策略
5种数据类型 String [html] view plaincopy 1.String 经常使用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操 ...
- 编程算法 - 高速排序算法 代码(C)
高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...
- c语言循环单链表
/************************************************************************* > File Name: singleLin ...