zoukankan      html  css  js  c++  java
  • POJ--1979

    BFS问题,根据原来代码修改一部分即可

    #include <stdio.h>
    #include <stdlib.h>
    #define size 20
    //先模拟_为1,#为0,生成数组如下:
    int map[size][size]={0};//用于bfs的数组
    int input[size][size]={0};//用于文件读入的数组
    //int map[size][size]={{1,1,1,1,0,1},{1,1,1,1,1,0},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1},{0,1,1,1,1,0},{1,0,1,1,0,1}};
    typedef struct node{
        int x;
        int y;
        int step;
    }node;
    node queue[100000];
    int head,tail;//队列头和队列尾
    int x[4]={-1,0,+1,0};//x坐标的变化
    int y[4]={0,+1,0,-1};//y坐标的变化
    int num=0;
    int W=0,H=0;
    node sourcepoint={7,1,2};//源点
    int handle;
    
    /* 函数名:enqueue
    *  功能:入队
    *  入口参数:要入队的节点
    *  返回值:暂无
    */
    void enqueue(node E){//用tail(对尾)进行插入操作
        queue[tail++] = E;//先入队,然后tail加一
    }
    /* 函数名:dequeue
    *  功能:出队
    *  入口参数:要出队的节点
    *  返回值:出队的元素
    */
    node dequeue(){//用head(队头)进行删除操作
        return queue[head++];//先出队,然后head加一
    }
    
    /* 函数名:bfs
    *  功能:广度优先搜索
    *  入口参数:1.源点坐标
                 2.
    *  返回值:
    */
    void bfs(node sourcepoint,int W,int H){
    
        map[sourcepoint.x][sourcepoint.y]=2;//把传染源置为2
        enqueue(sourcepoint);//源点入队
        node CurPoint ={};//当前点
        node NewPoint ={};//新的点
        while(head<tail){
        
            CurPoint = dequeue();//当前点出队列
            for(int i=0;i<4;i++){
                NewPoint.x = CurPoint.x + x[i];
                NewPoint.y = CurPoint.y + y[i];
                NewPoint.step = CurPoint.step+1;
            if((NewPoint.x<H)&&(NewPoint.y<W)&&(NewPoint.x>=0)&&(NewPoint.y>=0)&&(map[NewPoint.x][NewPoint.y]==1))//模拟_为1,#为0
            {
                 map[NewPoint.x][NewPoint.y] = NewPoint.step;
                  enqueue(NewPoint);
            }
    
            }
        }
    
    
    }
    void init_map(){
    
        for(int i=0;i<H;i++)
        {
            for(int j=0;j<W;j++)
            {
                if(input[i][j]==46)
                {
                    map[i][j] = 1;
                }
                else if(input[i][j]==35)
                {
                    map[i][j] = 0;
                }
                    else if(input[i][j]==64)
                    {
                        sourcepoint.x = i;
                        sourcepoint.y = j;
                        map[i][j] =1;
                }
            }
        }
    }
    int main(){
        bool ret=true;//截止条件
        //freopen("input.txt","r",stdin);
        while(ret){
        scanf("%d",&W);
        scanf("%d",&H);
        if(W==0&&H==0) {ret = false; return 0;}
        scanf("%c",&handle);
        for(int i=0;i<H;i++){
            for(int j=0;j<W;j++){
                
                scanf("%c",&input[i][j]);
            }
                scanf("%c",&handle);//每一行的垃圾
            }
        init_map();
        bfs(sourcepoint,W,H);
    
        num = 0;
        for(int i=0;i<H;i++){
            for(int j=0;j<W;j++)
            {
                if(map[i][j]>1) {
                num++;
                }
                //printf("%d ",map[i][j]);
            }
            //printf("
    ");
        }
        printf("%d
    ",num);
        }
    }
    大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
  • 相关阅读:
    python--模块与包
    内置函数 的总结
    迭代器 生成器 列表推导式 生成器表达式的一些总结
    函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数
    函数名的应用(第一对象) 闭包 装饰器
    动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
    函数的初识 函数的返回值 参数
    文件操作 常用操作方法 文件的修改
    遍历字典的集中方法 集合的作用 以及增删查的方法
    计算机硬件的小知识
  • 原文地址:https://www.cnblogs.com/linux0537/p/6121241.html
Copyright © 2011-2022 走看看