• HDU 4527 小明系列故事——玩转十滴水


    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4527

    这道题一开始做得时候没有思考周全,考虑了要爆炸的水滴的时间,但是没有考虑那些还没有爆炸的水珠应该在什么时候加1,这道题一定要以时刻来衡量。

    当前的水珠爆炸,它的4个小水珠飞到相邻格子里是下一秒的事。还有就是对方向的保存,一开始我是4个方向都分别写上处理办法的,但是这样代码冗长。

    下面看看AC代码,也让我自己受益匪浅。

    #include<iostream>
    #include<string>
    #include<string>
    #include<string.h>
    #include<stdio.h>
    #include<queue>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    #define maxn 10
    using namespace std;
    int mapp[7][7];
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    struct node{
        int x,y;
        int d;
       node (){}
       node (int _x,int _y,int _d):x(_x),y(_y),d(_d) {}
    };
    queue<node> q[2]  ;  //声明2个装node的容器
    void bfs(int x,int y){
       if(mapp[x][y]<4){
        mapp[x][y]++;
        return;
       }
       int cur=0,next=1,f,g;
       mapp[x][y]=0;
       for(int i=0;i<4;i++){
        f=x+dir[i][0];
        g=y+dir[i][1];
        if(f>=1&&f<=6&&g>=1&&g<=6){
            q[cur].push(node(f,g,i));
        }
       }
       node temp;
       while(!q[cur].empty()){
        while(!q[cur].empty()){
            temp=q[cur].front();
            q[cur].pop();
            if(mapp[temp.x][temp.y]==0){
                    f=temp.x+dir[temp.d][0];
                    g=temp.y+dir[temp.d][1];
                    if(f>=1&&f<=6&&g>=1&&g<=6)
                    q[next].push(node(f,g,temp.d));
            }else{
                mapp[temp.x][temp.y]++;
            }
        }
            for(int i=1;i<=6;i++){
                for(int j=1;j<=6;j++){
                    if(mapp[i][j]>=5){
                        mapp[i][j]=0;
                        for(int k=0;k<4;k++){
                                f=i+dir[k][0];
                                g=j+dir[k][1];
                                if(f>=1&&f<=6&&g>=1&&g<=6)
                                  q[next].push(node(f,g,k));
                        }
                    }
                }
            }
            swap(cur,next);
       }
    
    }
    int main(){
        int m,x,y;
        while(~scanf("%d", &mapp[1][1])){
           for(int i=1; i<=6; ++i){
                for(int j=(i==1?2:1); j<=6; ++j){
                    scanf("%d", &mapp[i][j]);
                }
            }
        cin>>m;
        for(int i=0;i<m;i++){
            cin>>x>>y;
            bfs(x,y);
        }
         for(int i=1;i<=6;i++){
                    for(int j=1;j<6;j++){
                        cout<<mapp[i][j]<<" ";
                    }
                    cout<<mapp[i][6]<<endl;
                }
                cout<<endl;
        }
       return 0;
    }
  • 相关阅读:
    使用纯资源DLL文件实现多语言菜单、界面文字、Tooltips等[转]
    用VC++打造有多语言菜单的应用程序[转]
    VC2008以资源形式实现多语言版本[转]
    GetWindowRect与GetClientRect 的区别[转]
    MFC拆分窗口及它们之间的数据交换[转]
    【排序算法】(7)快速排序
    【排序算法】(4)归并排序
    【排序算法】(3)插入排序
    【排序算法】(8)希尔排序
    【排序算法】(2)冒泡排序
  • 原文地址:https://www.cnblogs.com/wintersong/p/5251036.html
Copyright © 2020-2023  润新知