codingame
无聊登了一下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的更多相关文章
- c++17 代码你能看懂吗?
------------------------------------------------------------------------------ #include <vector&g ...
- F#周报2019年第1期
新闻 介绍versionsof.net InfoQ正在寻找F#社区的声音 使用F#开发端对端的实际应用 UnoPlatform上的F# Elmish 视频及幻灯片 事件溯源DIY02--事件,事件存储 ...
- Unity3D与C#网站收藏
siki学院(目前学习ing) http://www.sikiedu.com/ 雨松MOMO研究院 http://www.xuanyusong.com/ 知乎:Unity 开发教程相关回答(初步了解下 ...
- 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 ...
- coding game, 边打游戏边学编程,是一种怎么样的体验?
前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...
- 学习java知道这五个网站就够了
"这个国家的每个人都应该学习编程计算机,因为它教你如何思考." 当乔布斯几年前这么说时,他再次被证明是一个真正的有远见的人. 好吧,这很难反驳!如今,编程比以往任何时候都更加蓬勃发 ...
随机推荐
- Linux学习笔记(一)目录处理命令
目录处理命令 ls cd mkdir rmdir tree ls 英文原意: list 功能: 显示目录文件 语法: ls 选项[-ald] [文件或目录] ls -a 显示所有文件,包括隐藏文件 l ...
- Intellij IDEA 基础设置,个性化设置,好用的设置→_→
Intellij IDEA 个性化设置 Appearance & Behavior 外观和行为 Keymap 快捷键 Editor 编辑器设置 Plugins 插件 Version Contr ...
- IO多路复用小故事
背景故事 小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲. 这天, ...
- vue中解决时间在ios上显示NAN的问题
最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...
- Java 反射 -- 获取泛型类型
先写一个类: public class Demo03 { public void test01(Map<String, User> map, List<User> list) ...
- 带你玩linux集成环境
据我现在知道的,在linux一键部署集成环境的应用有: “宝塔面板” “LNMP" "XRDP" 参考:http://www.ampnmp.com/ 具体什么安装就直接百 ...
- QtConcurrent::run 运行类的成员函数
https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...
- Windows API Index
https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-api-list
- Linux系统管理第二次作业 目录和文件管理 rpm安装 创建yum仓库
chapter02 - 03 作业 1.分别用cat \tac\nl三个命令查看文件/etc/ssh/sshd_config文件中的内容,并用自己的话总计出这三个文档操作命令的不同之处? [ ...
- 《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.4 双路组相联高速缓存...
本节书摘来自异步社区<现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)>一书中的第2章,第2.4节,作者:[美]Curt Schimmel著,更多章节内容可以访问云 ...