无聊登了一下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. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  2. billu b0x2靶机渗透

    实战渗透靶机billu b0x2 攻击kali :192.168.41.147 靶机b0x2: 192.168.41.148 起手先nmap扫了一下 扫到了四个开放的端口,有ssh,http,rpcb ...

  3. 从零开始学习docker之docker的安装

    一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...

  4. vue中解决时间在ios上显示NAN的问题

    最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...

  5. ASP.NET Core 与 ASPOSE.Words for .NET

    Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,它提供的原生API可以对Word.Excel.PDF.Powerpoint.Outlook.CAD.图片.3D.ZI ...

  6. testlink配置修改

    1.      Read/write permissions报错 问题: Checking if  /var/testlink/logs/ directory exists [S] </B< ...

  7. docker 部署FastDFS

    教程:https://blog.csdn.net/fangchao2011/article/details/103202591 教程:https://www.jianshu.com/p/3f80cba ...

  8. 还在写CURD?试试这款基于mybatis-plus的springboot代码生成器

    目录 ⚡Introduction ✔️Release Features Quick Start Examples 1.Controller模板代码示例 2.Service模板代码示例 3.Servic ...

  9. 6.Python中内存是如何管理的?

    Python中内存是如何管理的? Python memory is managed by Python private heap space. All Python objects and data ...

  10. iterm2终端manpage高亮显示

    iterm2 据说是macOS平台上最好用的终端工具,今天下载来用了一下,发现确实很好.但是在使用man命令显示manpage的时候,颜色配置不是很让人满意,就像下面这样: 其实这样也是不错的,但是用 ...