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("\n");
    }
    printf("%d\n",num);
    }
}

 

posted @ 2016-12-01 11:34  Pumpkin0227  阅读(186)  评论(0编辑  收藏  举报