无聊登了一下condingame,通知说有本周谜题,正好刚撸完bfs,想尝试下。

题目链接:https://www.codingame.com/ide/17558874463b39b9ce6d420710807279bb1bd77e

题目大意:很有趣的题目,给你起始位置和终点位置,输出最短的路径,不过多了几个buff,垃圾球,开关,有害磁场

垃圾球:你可以移动(我没考虑这个东西,貌似用不到,因为后面说可以不动垃圾球)

开关:路过这个点,0/1状态变化一次

有害磁场:想通过磁场这个位置,必须把他关闭,方法是操作对应的开关

思路类似上一篇蓝桥杯迷宫还有poj3984

代码:

 #include<cstdio>
#include <algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define for(i, a, b) for(int i = a; i < b; i ++)//algorithm(要么不输入,输入必须在define前面,调换位置for的define会报错 using namespace std;
struct Node{
int r;
int c;
Node(int r, int c):r(r), c(c){}
Node(){}
}parent[][]; int dir[][] = {{, -}, {, }, {-, }, {, }};//上下左右
int main()
{
// freopen("C:\\Users\\GerJCS岛\\Desktop\\t.txt", "r", stdin);
int width;
int height;
int flag[][];
int step[][];
char str[][];
memset(flag, , sizeof(flag));
memset(parent, -, sizeof(parent));
memset(step, -, sizeof(step));
memset(str, '.', sizeof(str));
scanf("%d%d", &width, &height); getchar();
for(i, , height + ){//>=1 <= height
for(j, , width + )
scanf("%c", &str[j][i]);
getchar();
}
// for(i, 1, height + 1){//>=1 <= height
// for(j, 1, width + 1)
// printf("%c", str[j][i]);
// printf("\n");
// } int startX;
int startY;
scanf("%d%d", &startX, &startY);
int targetX;
int targetY;
scanf("%d%d", &targetX, &targetY); int switchCount;
scanf("%d", &switchCount);
int switchX;
int switchY;
int blockX;
int blockY;
int initialState; // 1 if blocking, 0 otherwise
for (i, , switchCount)
scanf("%d%d%d%d%d", &switchX, &switchY, &blockX, &blockY, &initialState);
//printf("%d %d %d %d\n", startX, startY, targetX, targetY); queue<Node> Q;
while(!Q.empty()) Q.pop();
Q.push(Node(startX, startY)); // printf("%d %d\n", Q.front().r, Q.front().c); flag[startX][startY] = ;
step[startX][startY] = ;//不算初始
int place;
while(!Q.empty()){
// printf("TEST\n");
Node node = Q.front();
Q.pop();//一开始忘了
int r = node.r;
int c = node.c;
for(i, , ){
int nowr = r + dir[i][];
int nowc = c + dir[i][];
// printf("%d%c%d\n", nowr, str[nowr][nowc], nowc);
if(nowr >= && nowc >= && nowr <= width && nowc <= height
&& !flag[nowr][nowc] && str[nowr][nowc] == '.'){
//printf("TEST\n");
flag[nowr][nowc] = ;
step[nowr][nowc] = step[r][c] + ;
Q.push(Node(nowr, nowc));
parent[nowr][nowc].r = r;
parent[nowr][nowc].c = c;
if(nowr == targetX && nowc == targetY){
place = step[nowr][nowc];
break;
}
}
}
} stack<char> S;//不用清空嘛
int r = width;
int c = height;
int r_r;
while(){
if(parent[r][c].r == - && parent[r][c].c == -)
break; if(parent[r][c].r < r)
S.push('R');
if(parent[r][c].r > r)
S.push('L');
if(parent[r][c].c < c)
S.push('D');
if(parent[r][c].c > c)
S.push('U'); r_r = parent[r][c].r;
c = parent[r][c].c;
r = r_r;//好蠢QAQ~
}
r = targetX; while(!S.empty()){
char pc = S.top();
S.pop();
printf("%c", pc);
}
printf("\n");
} //PS:这codingame的xy是反过来的,好别扭QAQ~,
//1,1 2,1
//1,2 2,2
//反手一想其实没什么影响,只是输出方向步伐,而不是坐标,就算是坐标也可以最后统一反向处理+增1操作
//打算把所有xy都调过来输入,在减一操作的
//想想还是算了,按题目来吧,不然不好调试,好反人类,,, //提示总线错误(莫名其妙没了。。。。) //写好后又是Standard Output Stream 什么都没有 /*
8 8
...#....
##.##.#.
.#..###.
.##.#...
..#.###.
.##...#.
..###.#.
........
1 1
8 8
0
*/

去注释代码:

 #include<cstdio>
#include <algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define for(i, a, b) for(int i = a; i < b; i ++) using namespace std;
struct Node{
int r;
int c;
Node(int r, int c):r(r), c(c){}
Node(){}
}parent[][]; int dir[][] = {{, -}, {, }, {-, }, {, }};//上下左右
int main()
{
freopen("C:\\Users\\GerJCS岛\\Desktop\\t.txt", "r", stdin);//这句话不注释会buss error
int width;
int height;
int flag[][];
int step[][];
char str[][];
memset(flag, , sizeof(flag));
memset(parent, -, sizeof(parent));
memset(step, -, sizeof(step));
memset(str, '.', sizeof(str));
scanf("%d%d", &width, &height); getchar();
for(i, , height + ){
for(j, , width + )
scanf("%c", &str[j][i]);
getchar();
}
int startX;
int startY;
scanf("%d%d", &startX, &startY);
int targetX;
int targetY;
scanf("%d%d", &targetX, &targetY); int switchCount;
scanf("%d", &switchCount);
int switchX;
int switchY;
int blockX;
int blockY;
int initialState; // 1 if blocking, 0 otherwise
for (i, , switchCount)
scanf("%d%d%d%d%d", &switchX, &switchY, &blockX, &blockY, &initialState); queue<Node> Q;
while(!Q.empty()) Q.pop();
Q.push(Node(startX, startY)); flag[startX][startY] = ;
step[startX][startY] = ;//不算初始
int place;
while(!Q.empty()){
Node node = Q.front();
Q.pop();//一开始忘了
int r = node.r;
int c = node.c;
for(i, , ){
int nowr = r + dir[i][];
int nowc = c + dir[i][];
if(nowr >= && nowc >= && nowr <= width && nowc <= height
&& !flag[nowr][nowc] && str[nowr][nowc] == '.'){
flag[nowr][nowc] = ;
step[nowr][nowc] = step[r][c] + ;
Q.push(Node(nowr, nowc));
parent[nowr][nowc].r = r;
parent[nowr][nowc].c = c;
if(nowr == targetX && nowc == targetY){
place = step[nowr][nowc];
break;
}
}
}
} stack<char> S;//不用清空嘛
int r = width;
int c = height;
int r_r;
while(){
if(parent[r][c].r == - && parent[r][c].c == -)
break; if(parent[r][c].r < r)
S.push('R');
if(parent[r][c].r > r)
S.push('L');
if(parent[r][c].c < c)
S.push('D');
if(parent[r][c].c > c)
S.push('U'); r_r = parent[r][c].r;
c = parent[r][c].c;
r = r_r;//好蠢QAQ~
}
r = targetX; while(!S.empty()){
char pc = S.top();
S.pop();
printf("%c", pc);
}
printf("\n");
} /*
第一组数据
8 8
...#....
##.##.#.
.#..###.
.##.#...
..#.###.
.##...#.
..###.#.
........
1 1 8 8 0
*/

PS:抱怨一下这个从1开始和xy反转这是反人类。。。

我第一次提示bus error莫名其妙就调没了,可能是第一次设置str为int类型

但是现在问题是跑1/30点的时候,平台的Standard Output Stream 什么都没有QAQ~,我输入题目1/30这组数据

 ...#....
##.##.#.
.#..###.
.##.#...
..#.###.
.##...#.
..###.#.
........

在本地是可以正确输出结果的QAQ~             (黑框输出的是:RRDDRDDDRRDDRR)

一会去撸铁,先放着。。

*********************更新**********************

真神奇,这道题只承认最后的cout里面的东西貌似。cout就好了,可是最后ans在本地也是对的,Standard Output却是个 0?的乱码

     char ans[];
int i = ;
while(!S.empty()){
ans[i ++] = S.top();
S.pop();
}
// cout << "RRDDRDDDRRDDRRL" << endl;
cout << ans << endl;//本地可以,为啥Standard有提示怪怪的东西。。> 0?
// printf("\n");

最后这么改了下还是不行。。。

问了下作者原来是地图搞错了,https://www.codingame.com/forum/t/community-puzzle-bender-episode-4/84756/21(头像为山崎县人,ID为GerJCS的是我)

改下就好了,过了1/30数据,原来是从(0,0)开始的

代码:

 #include<cstdio>
#include <algorithm>
#include<queue>
#include<iostream>
#include<stack>
#include<cstring>
#define for(i, a, b) for(int i = a; i < b; i ++) using namespace std;
struct Node{
int r;
int c;
Node(int r, int c):r(r), c(c){}
Node(){}
}parent[][]; int dir[][] = {{, -}, {, }, {-, }, {, }};//上下左右
char ans[];
int main()
{
// freopen("C:\\Users\\GerJCS岛\\Desktop\\t.txt", "r", stdin);//这句话不注释会buss error
int width;
int height;
int flag[][];
int step[][];
char str[][];
memset(flag, , sizeof(flag));
memset(parent, -, sizeof(parent));
memset(step, -, sizeof(step));
memset(str, '.', sizeof(str));
scanf("%d%d", &width, &height); getchar();
for(i, , height ){
for(j, , width )
scanf("%c", &str[j][i]);
getchar();
} // for(i, 0, height ){
// for(j, 0, width)
// printf("%c", str[j][i]);
// printf("\n");
// }
int startX;
int startY;
scanf("%d%d", &startX, &startY);
int targetX;
int targetY;
scanf("%d%d", &targetX, &targetY); int switchCount;
scanf("%d", &switchCount);
int switchX;
int switchY;
int blockX;
int blockY;
int initialState; // 1 if blocking, 0 otherwise
for (i, , switchCount)
scanf("%d%d%d%d%d", &switchX, &switchY, &blockX, &blockY, &initialState); // printf("%d %d %d %d\n", startX, startY, targetX, targetY); queue<Node> Q;
while(!Q.empty()) Q.pop();
Q.push(Node(startX, startY)); flag[startX][startY] = ;
step[startX][startY] = ;//不算初始
int place;
while(!Q.empty()){
Node node = Q.front();
Q.pop();//一开始忘了
int r = node.r;
int c = node.c;
for(i, , ){
int nowr = r + dir[i][];
int nowc = c + dir[i][];
if(nowr >= && nowc >= && nowr < width && nowc < height
&& !flag[nowr][nowc] && str[nowr][nowc] == '.'){
flag[nowr][nowc] = ;
step[nowr][nowc] = step[r][c] + ;
Q.push(Node(nowr, nowc));
parent[nowr][nowc].r = r;
parent[nowr][nowc].c = c;
if(nowr == targetX && nowc == targetY){
place = step[nowr][nowc];
break;
}
}
}
} stack<char> S;//不用清空嘛
int r = targetX;
int c = targetY;
int r_r;
while(){
if(parent[r][c].r == - && parent[r][c].c == -)
break; if(parent[r][c].r < r)
S.push('R');
if(parent[r][c].r > r)
S.push('L');
if(parent[r][c].c < c)
S.push('D');
if(parent[r][c].c > c)
S.push('U'); r_r = parent[r][c].r;
c = parent[r][c].c;
r = r_r;//好蠢QAQ~
}
// r = targetX; // memset(ans, '', sizeof(ans));
int i = ;
while(!S.empty()){
ans[i++ ] = S.top();
// printf("%c", ans[i ++]);
// cout << ans[i ++];//这两句都不行,不能单独输出,必须输出整个字符串,ans
S.pop();
// printf("%c", pc);
}
cout <<ans<< endl;
// ans[i] = '\0';
// cout << "RRDDRDDDRRDDRRL" << endl;
// cout << ans << endl;//本地可以,为啥Standard有提示怪怪的东西。。> 0?
// printf("\n");
} /*
第一组数据
8 8
...#....
##.##.#.
.#..###.
.##.#...
..#.###.
.##...#.
..###.#.
........
1 1 8 8 0 10 10
##########
#...#....#
###.##.#.#
#.#..###.#
#.##.#...#
#..#.###.#
#.##...#.#
#..###.#.#
#........#
##########
1 1
8 8
0 */

codingame的更多相关文章

  1. c++17 代码你能看懂吗?

    ------------------------------------------------------------------------------ #include <vector&g ...

  2. F#周报2019年第1期

    新闻 介绍versionsof.net InfoQ正在寻找F#社区的声音 使用F#开发端对端的实际应用 UnoPlatform上的F# Elmish 视频及幻灯片 事件溯源DIY02--事件,事件存储 ...

  3. Unity3D与C#网站收藏

    siki学院(目前学习ing) http://www.sikiedu.com/ 雨松MOMO研究院 http://www.xuanyusong.com/ 知乎:Unity 开发教程相关回答(初步了解下 ...

  4. Awesome Go精选的Go框架,库和软件的精选清单.A curated list of awesome Go frameworks, libraries and software

    Awesome Go      financial support to Awesome Go A curated list of awesome Go frameworks, libraries a ...

  5. coding game, 边打游戏边学编程,是一种怎么样的体验?

    前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...

  6. 学习java知道这五个网站就够了

    "这个国家的每个人都应该学习编程计算机,因为它教你如何思考." 当乔布斯几年前这么说时,他再次被证明是一个真正的有远见的人. 好吧,这很难反驳!如今,编程比以往任何时候都更加蓬勃发 ...

随机推荐

  1. JDBC教程——检视阅读

    JDBC教程--检视阅读 参考 JDBC教程--W3Cschool JDBC教程--一点教程,有高级部分 JDBC教程--易百 JDBC入门教程 – 终极指南 略读 三层架构详解,JDBC在数据访问层 ...

  2. Python爬虫---爬取腾讯动漫全站漫画

    目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...

  3. Mac安装Nginx、Mysql、PHP、Redis

    安装xcode命令行工具的命令 xcode-select --install   安装homebrew: ruby -e "$(curl -fsSL https://raw.githubus ...

  4. JS 获取GET 参数

    对于 URL,我们需要了解更多,因为我们的开发中可能会需要提取URL的部分信息来做不同的事情,事实上这也是与后端交互的一种独特的方式,当然这肯定是安全的,当请求被返回,关于 url 的信息就被记录在了 ...

  5. 2019-2020-1 20199308《Linux内核原理与分析》第三周作业

    <Linux内核分析> 第二章 操作系统是如何工作的 2.1 函数调用堆栈 3个关键性的方法机制(3个法宝) 存储程序计算机 函数调用堆栈机制 中断 堆栈相关的寄存器 ESP:堆栈指针(s ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  7. [Linux] 检查是否已有进程在运行

    出处:sblim-sfcb-1.4.9 / sfcBroker.c int process_is_running() { #define STRBUF_LEN 512 #define BUF_LEN ...

  8. Scala教程之:可扩展的scala

    文章目录 隐式类 限制条件 字符串插值 s 字符串插值器 f 插值器 raw 插值器 自定义插值器 Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能: 隐式类: 允许给已有的类型添 ...

  9. Libra教程之:move语言的特点和例子

    文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...

  10. 【三剑客】awk命令2

    1. 程序结构: Begin 和 End模块 awk的程序的结构:Begin块,Body块,End块. BEGIN块:BEGIN {awk-commands} BEGIN块在被程序启动时启动,且只执行 ...