易错点——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;}
原创粉丝点击