POJ1250解题报告补
发布日期:2021-07-24 21:57:43 浏览次数:16 分类:技术文章

本文共 4508 字,大约阅读时间需要 15 分钟。

参考我前一篇文章有详细解析

关于本篇

在这篇里,我对POJ1250想到了新的解题方法,同时在使用新方法的时候调试了许多有意思的bug,与诸君分享

新方法思路

我用specialized二值数组去接看出现的字符是否为第一次出现,如果第一次出现,就把specialized[s[i]-'A']置为true,(这里用了技巧,用大写字符减去‘A’得到唯一的一个数字)然后再判断是否房间空,房间不空就把trek[s[i-'A']]置为true,这样就标志着s[i]入住了,如果不入住就把ans++,ans存储离开的人数详细看着代码思考,这里只是简单介绍

代码

#include 
#include
using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized));//这两行代码不能放错地方 memset(trek,false,sizeof(trek)); int ans=0; //初始化ans for(int i=0;i
0){ trek[s[i]-'A']=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]-'A']){ //判断第二次出现是住的客人还是离开的客人 if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
上个版本实测通过,同时还有很多版本,比如说对里面的if-else 进行修改啥的。。。

又想到一个可以AC的版本,故放之于博客

代码:

#include 
//亮点已经加注释#include
using namespace std;#define max 257 //因为字符ASCII码值不会大于255,所以定义为257即可满足bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); int ans=0; for(int i=0;i
0){ trek[s[i]]=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]]){ if(trek[s[i]]){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
下面是找bug过程,各位有兴趣的小伙伴可以去想一下为什么这些代码过不了?

思考题找bug

以下代码都是博主自己在AC过程中改错的代码,觉得错的比较有意思,故拿出来和诸君分享,各位有兴趣可以去试一下为什么错了。(答案附在文章最后)

代码1:

#include 
#include
using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); int ans=0; for(int i=0;i
0){ trek[s[i]-'A']=true; n--; } else { ans++; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<

代码2:

#include 
#include
using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); while(cin>>n &&n){ cin>>s; int ans=0; for(int i=0;i
0){ trek[s[i]-'A']=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<

代码3:

#include 
#include
using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); while(cin>>n &&n){ cin>>s; int ans=0; for(int i=0;i
0){ trek[s[i]-'A']=true; n--; } else { ans++; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<

思考题解答

代码1:错在for循环中的两个if在上个if执行玩了之后specialized的值会更改,所以下面那个if可能会执行,这样导致结果错误。

代码2:specialized,trek布尔数组初始化地方不对,按那种写法,第二次输入字符串再判断的时候会用到第一次字符串的判断留下的在specialized和trek数组的结果,所以要在每次循环时都初始化一下

代码3:代码1和代码2的综合错误

还有说个题外话:

if-else 结果可以用 if结构加上 continue来代替另外if(!flag) 等价于 if(flag==0)

end

seen                                2015-09-14

转载地址:https://blog.csdn.net/qq_23100787/article/details/48438229 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ3602解题报告
下一篇:POJ3619解题报告

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月17日 23时36分37秒