P1825 诡异的题
一道不难的题,可是挑了好久也没调好!因为最开始写的代码太复杂了,一大堆嵌套括号,其中有一个ny写成了nx一直没发现。后来用新定义变量取代了那些复杂的用函数、"."和方括号表达出来的量,尽管并没有让程序更快,却让我一眼便发现了错误,直接改正,教训是代码不要有太多中小括号嵌套,否则很难排错
原复杂代码:
#include <iostream>
#include <cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
//1825
int N,M,b[305][305];
char m[305][305];
struct trs
{
int ax,ay,bx,by;
trs(){ax=ay=bx=by=0;}
};
struct pos
{
int x,y,t;
pos(){x=y=t=0;}
pos(int X,int Y,int T){x=X;y=Y;t=T;}
}npos;
map<char,trs> trsn;
string s;
const int kx[5]={0,0,0,1,-1},
ky[5]={0,1,-1,0,0};
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>s;
for(int j=0;j<M;j++)
{
m[i][j+1]=s[j];
if(s[j]=='@') npos.x=i,npos.y=j+1;
if('A'<=s[j]&&s[j]<='Z')
{
if(trsn[s[j]].ax==0)
{
trsn[s[j]].ax=i,trsn[s[j]].ay=j+1;
}
else
{
trsn[s[j]].bx=i,trsn[s[j]].by=j+1;
}
}
}
}
for(int i=1;i<=N;i++)m[i][0]=m[i][M+1]='#';
for(int i=1;i<=M;i++)m[0][i]=m[N+1][i]='#';
npos.t=0;//keyishan
b[npos.x][npos.y]=1;
queue<pos> q;
q.push(npos);
while(!q.empty())
{
npos=q.front();q.pop();
if(m[npos.x][npos.y]=='=')
{
cout<<npos.t<<endl;
return 0;
}
for(int i=1;i<=4;i++)
{
if(m[npos.x+kx[i]][npos.y+ky[i]]=='#')
continue;
if(b[npos.x+kx[i]][npos.y+ky[i]]==1) //判重
continue;
if(m[npos.x+kx[i]][npos.y+ky[i]]>='A'&&m[npos.x+kx[i]][npos.y+ky[i]]<='Z')
{ //cout<<m[npos.x+kx[i]][npos.y+ky[i]];
b[npos.x+kx[i]][npos.y+ky[i]]=1;
if(trsn[m[npos.x+kx[i]][npos.y+ky[i]]].ax==npos.x+kx[i]
&&trsn[m[npos.x+kx[i]][npos.y+ky[i]]].ay==npos.y+kx[i])
q.push(pos(trsn[m[npos.x+kx[i]][npos.y+ky[i]]].bx,trsn[m[npos.x+kx[i]][npos.y+ky[i]]].by,npos.t+1));
else
q.push(pos(trsn[m[npos.x+kx[i]][npos.y+ky[i]]].ax,trsn[m[npos.x+kx[i]][npos.y+ky[i]]].ay,npos.t+1));
}
else
{
b[npos.x+kx[i]][npos.y+ky[i]]=1;
q.push(pos(npos.x+kx[i],npos.y+ky[i],npos.t+1));
}
/*cout<<endl;cout<<endl;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)cout<<b[i][j];
cout<<endl;
}*/
}
}
cout<<-1<<endl;
return 0;
}
神清气爽的新代码
#include <iostream>
#include <cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
//1825
int N,M,b[305][305];
char m[305][305];
struct trs
{
int ax,ay,bx,by;
trs(){ax=ay=bx=by=0;}
};
struct pos
{
int x,y,t;
pos(){x=y=t=0;}
pos(int X,int Y,int T){x=X;y=Y;t=T;}
}npos;
map<char,trs> trsn;
string s;
const int kx[5]={0,0,0,1,-1},
ky[5]={0,1,-1,0,0};
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>s;
for(int j=0;j<M;j++)
{
m[i][j+1]=s[j];
if(s[j]=='@') npos.x=i,npos.y=j+1;
if('A'<=s[j]&&s[j]<='Z')
{
if(trsn[s[j]].ax==0)
{
trsn[s[j]].ax=i,trsn[s[j]].ay=j+1;
}
else
{
trsn[s[j]].bx=i,trsn[s[j]].by=j+1;
}
}
}
}
for(int i=1;i<=N;i++)m[i][0]=m[i][M+1]='#';
for(int i=1;i<=M;i++)m[0][i]=m[N+1][i]='#';
npos.t=0;//keyishan
b[npos.x][npos.y]=1;
queue<pos> q;
q.push(npos);
while(!q.empty())
{
npos=q.front();q.pop();
if(m[npos.x][npos.y]=='=')
{
cout<<npos.t<<endl;
return 0;
}
for(int i=1;i<=4;i++)
{
int nx=npos.x+kx[i],ny=npos.y+ky[i];
if(m[nx][ny]=='#')
continue;
if(b[nx][ny]==1) //判重
continue;
if(m[nx][ny]>='A'&&m[nx][ny]<='Z')
{
b[nx][ny]=1;
if(trsn[m[nx][ny]].ax==nx&&trsn[m[nx][ny]].ay==ny)
q.push(pos(trsn[m[nx][ny]].bx,trsn[m[nx][ny]].by,npos.t+1));
else
q.push(pos(trsn[m[nx][ny]].ax,trsn[m[nx][ny]].ay,npos.t+1));
}
else
{
b[nx][ny]=1;
q.push(pos(nx,ny,npos.t+1));
}
/*cout<<endl;cout<<endl;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)cout<<b[i][j];
cout<<endl;
}*/
}
}
cout<<-1<<endl;
return 0;
}
但这个代码只有95分,有一个点RE了。
诡异的是,我下面这个代码AC了:
#include <iostream>
#include <cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
int N,M,b[310][310];
char m[310][310];
struct trs
{
int ax,ay,bx,by;
trs(){ax=ay=bx=by=0;}
};
struct pos
{
int x,y,t;
pos(){x=y=t=0;}
pos(int X,int Y,int T){x=X;y=Y;t=T;}
}npos;
map<char,trs> trsn;
string s;
const int kx[5]={0,0,0,1,-1},
ky[5]={0,1,-1,0,0};
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>s;
for(int j=0;j<M;j++)
{
m[i][j+1]=s[j];
if(s[j]=='@') npos.x=i,npos.y=j+1;
if('A'<=s[j]&&s[j]<='Z')
{
if(trsn[s[j]].ax==0)
{
trsn[s[j]].ax=i,trsn[s[j]].ay=j+1;
}
else
{
trsn[s[j]].bx=i,trsn[s[j]].by=j+1;
}
}
}
}
b[npos.x][npos.y]=1;
queue<pos> q;
q.push(npos);
while(!q.empty())
{
npos=q.front();q.pop();
if(m[npos.x][npos.y]=='=')
{
cout<<npos.t<<endl;
return 0;
}
for(int i=1;i<=4;i++)
{
int nx=npos.x+kx[i],ny=npos.y+ky[i];
if(nx<1||nx>N||ny<1||ny>M||m[nx][ny]=='#'||b[nx][ny]==1)
continue;
if(m[nx][ny]>='A'&&m[nx][ny]<='Z')
{
b[nx][ny]=1;
if(trsn[m[nx][ny]].ax==nx&&trsn[m[nx][ny]].ay==ny)
q.push(pos(trsn[m[nx][ny]].bx,trsn[m[nx][ny]].by,npos.t+1));
else
q.push(pos(trsn[m[nx][ny]].ax,trsn[m[nx][ny]].ay,npos.t+1));
}
else
{
b[nx][ny]=1;
q.push(pos(nx,ny,npos.t+1));
}
}
}
cout<<-1<<endl;
return 0;
}
为什么说这个代码诡异呢,因为这代码本质上和上一个是一样的,上一个是把越界数据设置为墙,然后用不撞墙代码来确保不越界,后一个是直接确保不越界。凭什么后一个导致RE?一定要研究清楚。
另外,还有一个诡异的问题。当输入某组数据(一会我给出)时,理应输出75,洛谷的评测数据是75,我的程序也算出了75。当我自己用肉眼观察那组数据时,发现这个迷宫应该没有解呀应该走不出来呀,怎么会75步就走出来了呢。
数据是这样的:
########################################################################################################################################################################################################
=.B####.#.##....#..###.#.#.#######Y#.#.##.####K..I###....####.#####.####.#.#.########.#...#F#####.##..####......#.##.#######..##.#.#######.#..###.#F......P###..##..##..#.###..###.#.####M.#.###.##.####
####.######.D######..#.#####S.####P#...##.##.##########.##.##.####.##...#########.#.##...#..J.#..#.#.#..######.#N####.##.###.....L####.L..#..#EE#..#.#..###.####..#####..#...Q#####.#####K..#.##.####..#
#######.#.#..#.#...###..##I...#####.#####.####..##.#####.#####..#####.##..#..####.#######.....#..##.#####.#####..#...###.....#####.#..#...#.#...G#...###...##...####.#####....#.##########....#####...##
######.#.#..###..##.##.##.#########.####.#.#.#.###.#.#.###..R##.#.####.####.#.#..####..###########.###.##.#.Q###.#.##.##..####..#####.##B###..#..##..#####.###...##..########.####.#.#..###.##J.##..#..#
##X...#.##...###..########...#.#.##.###......#####.#####.#A####.##.#.##.#..###.##..#####....######..#...####..##.#H..#O...###.##..##.####.#.#.##N.#.####.########..####.##.##..###########...##X#..#..##
#####.###..###.###.#####....##.####.####.#.#..#.#..###.###..###.#.#####..###.###...###.#####.####.##.###...#.#..###.#############.##.##..###.#G##.##..######..###.###.#.####.####.###.###.#..##...##.###
###A..##..#####..#..#.###.##...#YC#.#O...##.#..........######.###..#.#.####.###..#######....##..#.###.#..#..#...##.##M..#.#..#...#.##.####.##.#S####.###.##..#.#######.######.#D######.#..#......###..##
######R..#.###.##.#.#.##.###..######.##..#.##..#####..Z###..#H.#.####.#.#.#.#ZC##...#...#.....###.#..###...#####.###..##.####..##.#.##..#####.##########.#.#..#.#...####.####...###...##...#..###.#...@#
########################################################################################################################################################################################################
这个迷宫我自己从出口倒着走,发现所有路都是死胡同,这就诡异了,我和洛谷的算法同时算出75步能走出,可我自己观察这个迷宫时却发现走不出来
P1825 诡异的题的更多相关文章
- 【BZOJ】【1011】【HNOI2008】遥远的行星
神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信 ...
- 题解-洛谷P1184 高手之在一起
https://www.luogu.org/problemnew/show/P1184 (题目出处) 见到地名,自然就想到字符串了.可以从第一天开始,将她的位置与高手方便取得地方一一比较,(char字 ...
- 洛谷 P2664 树上游戏 解题报告
P2664 树上游戏 题目描述 \(\text{lrb}\)有一棵树,树的每个节点有个颜色.给一个长度为\(n\)的颜色序列,定义\(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以及 ...
- P2857 [USACO06FEB]稳定奶牛分配Steady Cow Assignment
题目描述 Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns ...
- 51nod 1222 最小公倍数计数【莫比乌斯反演】
参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum ...
- (诡异Floyd&自环)MZ Training 2014 #15 E题(POJ 2240)
你们见过这么诡异的FLOYD吗? 先上题. [Description] 货币的汇率存在差异.比如,如果1美元购买0.5英镑,1英镑买10法郎.而1法国法郎买0.21美元.然后,通过转换货币,一个聪明的 ...
- 套题T8&T9
A - 8球胜负(eight) Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submi ...
- 【翻译】Zakas解答Baranovskiy的JavaScript测验题
原文:http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/ ---------------- ...
- linux诡异的半连接(SYN_RECV)队列长度
linux诡异的半连接(SYN_RECV)队列长度(一) >>转载请注明来源:飘零的代码 piao2010 ’s blog,谢谢!^_^>>本文链接地址:linux诡异的半连接 ...
- A - 娜娜梦游仙境系列——诡异的钢琴
A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
随机推荐
- .NET微信网页开发之网页授权获取用户基本信息
开发背景 当用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑.我们一般通过用户网页授权来无感实现用户登录,并获取用户的微信信息. 注意:用户管理类 ...
- Git提交修正
应用场景 日常开发中我们可能会遇到这样的问题 1.提交了代码有错误 2.提交的信息写错了 3.漏了一些文件没有提交 ...... 再或者我们写一个功能时,中间有很多小的提交,这中间就会产生特别多的co ...
- ES索引误删的名场面
ES索引误删的名场面 慌了3秒,果断发个邮件: 01 最近,在版本发布时: ES线上未备份的索引,被当场「误删」了: 对于新手来说,妥妥的社死名场面: 对于老手来说,慌它3秒表示一下态度: 当时的情况 ...
- 华企盾DSC邮件发送成功,但是不解密也没有任何提示(未添加白名单)
用Debugview监控整个过程,若日志中有信任邮箱未添加说明,白名单邮箱未添加或者添加错了(检查空格之类的或重新添加)
- 谷粒学院通用工具类R类
import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.HashMap; import ...
- IDEA美化教程
一.IDEA 字体大小怎么设置(图文教程) IDEA 初次安装时,默认字体非常小,这种情况下,代码阅读起来非常费劲,对保护视力非常不友好.那么,要如何在 IDEA 中设置字体大小呢? 这里介绍两种方法 ...
- .NET周刊【1月第1期 2023-01-07】
一月头条:C# 被评为2023年度编程语言! 在TIOBE指数的历史上,祝贺 C# 首次赢得了年度编程语言奖项!C# 已经是十大顶尖选手超过两个十年了,现在它正在迎头赶上四大语言,凭借一年内最大增幅( ...
- 【Tinyui】极简跨平台桌面端小工具开发框架
导航 Github Gitee 开发指南 用户手册 说明 在产品或项目工作中,可能会遇到需要给非开发人员或者客户提供简易的PC小工具,这些小工具通常用户交互比较简单:功能也不复杂:同时需要支持多平台以 ...
- Winform PictureBox图片旋转
Image img = this.pictureBox1.Image; img.RotateFlip(RotateFlipType.Rotate90FlipNone); this.pictureBox ...
- NebulaGraph实战:1-NebulaGraph安装和基础操作
以前使用Neo4j图数据库,考虑到生产环境需要最终选择了NebulaGraph图数据库.对于数据要求比较高的领域,比如医疗.财务等,暂时还是离不开知识图谱的.后面主要围绕LLM+KG做一些行业解决 ...