标签:队列 问题 and define 广度优先搜索 enqueue 搜索 point 条件
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); } }
标签:队列 问题 and define 广度优先搜索 enqueue 搜索 point 条件
原文地址:http://www.cnblogs.com/linux0537/p/6121241.html