易错点——queue中的入队出队
来源:互联网 发布:linux怎么显示中文 编辑:程序博客网 时间:2024/05/20 15:37
哎呀呀呀呀呀,queue没学好就是不行啊,每次都把队列想象成头进尾出,然后就尴尬了。
queue前期最大的用处就是BFS了,哎,每次BFS都去访问queue.back()怎么能对啊,最重要的还不是这个,是我每写一次就忘一次,这BFS还怎么写啊所以今天就吧这个错误记录到博客上,以免以后再犯。
这题我做了好久才发现这个错误,尴尬。
题目网址:微软大楼设计方案(戳我)
错误的代码:
#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#include<cstring>int gox[4] = {0,1,0,-1},goy[4] = {1,0,-1,0},num[1001][1001],f[1001][1001],indexx[1001],indexy[1001],n,m,k;const int inf = 0x3f3f3f3f;int get_ans(int x1,int y1,int x2,int y2){ std::queue<int> x; std::queue<int> y; std::queue<int> deep; x.push(x1);y.push(y1);deep.push(0); f[x1][y1] = 1; while(!x.empty()) { int tempx = x.back(),tempy = y.back(),tempdeep = deep.back(); x.pop();y.pop();deep.pop(); for(int i = 0;i<4;i++) { int temp1 = tempx+gox[i],temp2 = tempy+goy[i]; if(num[temp1][temp2]==0||f[temp1][temp2]==1)continue; f[temp1][temp2] = 1; if(temp1==x2&&temp2==y2)return tempdeep+1; x.push(temp1);y.push(temp2);deep.push(tempdeep+1); } } return inf;}void change(int l,int h){ for(int i = 1;i<=h;i++) num[l][i] = 1;}int main(){// freopen("code.in","r",stdin);// freopen("code.out","w",stdout); std::cin>>n>>k; for(int i = 1;i<=n;i++) { int a; std::cin>>a; change(i,a); } std::cin>>m; for(int i = 1;i<=m;i++) { int a,b; std::cin>>a>>b; indexx[i] = a;indexy[i] = b; } int ans = 0; for(int i = 1;i<=m;i++) for(int j = i+1;j<=m;j++) { memset(f,0,sizeof(f)); if(get_ans(indexx[i],indexy[i],indexx[j],indexy[j])<=k) { ans++; } } std::cout<<ans;// std::cout<<get_ans(3,1,4,3);// fclose(stdin);// fclose(stdout); return 0;}
就是因为那个back啊啊啊啊啊啊,浪费了我好几个小时啊啊啊啊啊。
正确代码:
#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#include<cstring>int gox[4] = {0,1,0,-1},goy[4] = {1,0,-1,0},num[1001][1001],f[1001][1001],indexx[1001],indexy[1001],n,m,k;const int inf = 0x3f3f3f3f;int get_ans(int x1,int y1,int x2,int y2){ std::queue<int> x; std::queue<int> y; std::queue<int> deep; x.push(x1);y.push(y1);deep.push(0); f[x1][y1] = 1; while(!x.empty()) { int tempx = x.front(),tempy = y.front(),tempdeep = deep.front(); x.pop();y.pop();deep.pop(); for(int i = 0;i<4;i++) { int temp1 = tempx+gox[i],temp2 = tempy+goy[i]; if(num[temp1][temp2]==0||f[temp1][temp2]==1)continue; f[temp1][temp2] = 1; if(temp1==x2&&temp2==y2)return tempdeep+1; x.push(temp1);y.push(temp2);deep.push(tempdeep+1); } } return inf;}void change(int l,int h){ for(int i = 1;i<=h;i++) num[l][i] = 1;}int main(){// freopen("code.in","r",stdin);// freopen("code.out","w",stdout); std::cin>>n>>k; for(int i = 1;i<=n;i++) { int a; std::cin>>a; change(i,a); } std::cin>>m; for(int i = 1;i<=m;i++) { int a,b; std::cin>>a>>b; indexx[i] = a;indexy[i] = b; } int ans = 0; for(int i = 1;i<=m;i++) for(int j = i+1;j<=m;j++) { memset(f,0,sizeof(f)); if(get_ans(indexx[i],indexy[i],indexx[j],indexy[j])<=k) { ans++; } } std::cout<<ans;// std::cout<<get_ans(3,1,4,3);// fclose(stdin);// fclose(stdout); return 0;}
阅读全文
0 0
- 易错点——queue中的入队出队
- 使用Queue类,模拟完成一个队列的入队出队处理过程,能图形化显示入队出队过程。
- 队列之出队入队
- 队列操作--出队入队
- 链表初解(四)——队列的入队和出队
- 实验C—3 顺序队列基本操作入队与出队
- 实验C—4 链队列基本操作出队与入队
- queue队列容器入队,出队,读取队首元素,队尾元素,判断是否为空
- 【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)
- 链队的创建、入队、出队
- 队的定义、入队和出队
- 链式队列操作,初始化,入队,出队
- 编程实现队列入队出队操作
- 队列的入队、出队操作实现
- 顺序队列的创建、入队、出队
- 队列基本操作 出队与入队
- c#字符串类型的入队、出队
- 队列的创建,入队,出队,遍历
- stl->deque
- 14 orangepi 内核里控制IO口
- 常用的正则表达式判断手机号邮箱等
- 四种实体类类型概念:VO、DTO、DO、PO
- 过滤IE浏览器版本
- 易错点——queue中的入队出队
- 39、平衡二叉树
- webDriver 搜索有道页面
- JavaWeb学习总结(十二)——Session
- js中验证输入数字的方法
- 微信小程序架构分析 (下)
- python 安装mxnet框架过程遇到的问题若干
- 面向对象顺序图
- mysql连接超时timeout问题