题目链接:传送门

题目大意:给你一个图,要从起点走到终点并且要吃够足够的金币才能出去,图上有金币(只能吃一次),

有传送门(用一次消耗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走迷宫)的更多相关文章

  1. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  2. sdut 2449走迷宫【最简单的dfs应用】

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...

  3. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  4. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  5. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  6. Problem A: 走迷宫问题

    Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...

  7. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  8. P1238 走迷宫

    原题链接 https://www.luogu.org/problemnew/show/P1238 为了巩固一下刚学习的广搜,练一下迷宫类型的题 不过这道题我用的深搜..... 看问题,我们就知道这道题 ...

  9. golang 实现广度优先算法(走迷宫)

    maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...

随机推荐

  1. CodeIgniter 2.X 于 PHP5.6 兼容错误

    本篇文章由:http://xinpure.com/codeigniter-2-x-to-php5-6-compatible-error/ CI 3.0 已兼容此问题 在代码迁移的过程中,遇到了一个 P ...

  2. PHP 导出 CSV 文件用 Excel 打开出现中文乱码

    本篇文章由:http://xinpure.com/php-export-csv-file-opened-by-excel-appear-garbled/ 乱码情况 写了一段导出 CSV 文件的代码,可 ...

  3. sql 语句中 id&lt ;SELECT * FROM t_blog WHERE id&lt;#{id} ORDER BY id DESC LIMIT 1

  4. std::vector<char> 转 const char

    std::stringstream oss; for(unsigned int i=0;i < buffer->size();i++){ oss<<(*buffer)[i];  ...

  5. 转: python 利用EMQ实现消费者和生产者模型

    消费者 """ 测试emq-消费者 @author me """ import paho.mqtt.client as mqtt impor ...

  6. express 创建node服务器

    var express = require('express'); var app = new express(); app.listen(3000); app.get('/',function(re ...

  7. unity, 在surface shader中访问顶点色

    //ref: Custom data computed per-vertex: http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html ...

  8. Redis 5种数据类型,2种特殊数据处理策略

    5种数据类型 String [html] view plaincopy 1.String   经常使用命令:   除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操 ...

  9. 编程算法 - 高速排序算法 代码(C)

    高速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的高速排序算法, 作为一个编程者, 不论什么时候都要完整的手写. 代码: /* * m ...

  10. c语言循环单链表

    /************************************************************************* > File Name: singleLin ...