• 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);
        }
    }
    大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
  • 相关阅读:
    【以前的空间】poj 2288 Islands and Bridges
    【以前的空间】网络流合集
    【以前的空间】 单调队列系列
    【以前的空间】几道平衡树
    【以前的空间】vijos 1720 阿狸的打字机
    对拍程序
    【Ubuntu】编写一个c语言代码
    用Matlab对数据进行线性拟合算法
    Oracle视图传递参数
    oracle decode的用法
  • 原文地址:https://www.cnblogs.com/linux0537/p/6121241.html
Copyright © 2020-2023  润新知