无聊登了一下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. Linux学习笔记(一)目录处理命令

    目录处理命令 ls cd mkdir rmdir tree ls 英文原意: list 功能: 显示目录文件 语法: ls 选项[-ald] [文件或目录] ls -a 显示所有文件,包括隐藏文件 l ...

  2. Intellij IDEA 基础设置,个性化设置,好用的设置→_→

    Intellij IDEA 个性化设置 Appearance & Behavior 外观和行为 Keymap 快捷键 Editor 编辑器设置 Plugins 插件 Version Contr ...

  3. IO多路复用小故事

    背景故事 小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲. 这天, ...

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

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

  5. Java 反射 -- 获取泛型类型

    先写一个类: public class Demo03 { public void test01(Map<String, User> map, List<User> list) ...

  6. 带你玩linux集成环境

    据我现在知道的,在linux一键部署集成环境的应用有: “宝塔面板” “LNMP" "XRDP" 参考:http://www.ampnmp.com/ 具体什么安装就直接百 ...

  7. QtConcurrent::run 运行类的成员函数

    https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...

  8. Windows API Index

    https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-api-list

  9. Linux系统管理第二次作业 目录和文件管理 rpm安装 创建yum仓库

    chapter02 - 03 作业      1.分别用cat \tac\nl三个命令查看文件/etc/ssh/sshd_config文件中的内容,并用自己的话总计出这三个文档操作命令的不同之处? [ ...

  10. 《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.4 双路组相联高速缓存...

    本节书摘来自异步社区<现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)>一书中的第2章,第2.4节,作者:[美]Curt Schimmel著,更多章节内容可以访问云 ...