#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
typedef struct node{
int x;
int y;
int step;
}node;
//int maze[SIZE][SIZE] ={{1,1,0,0,1},{1,0,0,1,0},{0,1,0,1,0},{1,1,1,1,0},{1,1,1,1,1}};
int maze[SIZE][SIZE] = {};//迷宫
int num[SIZE][SIZE] = {{1,0,0,0,0},{},{},{},{}};//每个宫格被传染的次数,初始起点传染次数为1
node queue[30];//队列
int head,tail;//队头 队尾
int x[4] = {-1,0,1,0};//迷宫上/右/下/左四个方向
int y[4] = {0,1,0,-1};
void enqueue(node E){//用tail(对队尾)进行插入操作
queue[tail++] = E;//先入队,tail加1
}
node dequeue(){//用head(队头)进行删除操作
return queue[head++]; //先出队,然后head加一,返回出队元素
}
void print(){
for(int i=0;i<SIZE;i++){
for(int j=0;j<SIZE;j++){
printf("%d ",maze[i][j]);
}
printf("\n");
}
}
void print1(){
for(int i=0;i<SIZE;i++){
for(int j=0;j<SIZE;j++){
printf("%d ",num[i][j]);
}
printf("\n");
}
}
int main(){
print();
printf("**************");
printf("\n");
node SourcePoint = {0,0,1};//初始化原点
enqueue(SourcePoint);//源点入队列
maze[0][0] = 1;//把传染源置为1
node CurPiont = {};//当前点
node NewPiont = {0,0,10000};//新点,step设置比较大的值(不可能达到的值)
while(head<tail){//队列运算结束条件
//printf("%d %d\n", head, tail);
CurPiont = dequeue();//当前点出队列
for(int i=0;i<4;i++){//四个方向移动
NewPiont.x = CurPiont.x + x[i];
NewPiont.y = CurPiont.y + y[i];
//碰到 NewPiont.step (已经被感染过的)
if((NewPiont.x>=0)&&(NewPiont.x<SIZE)&&(NewPiont.y>=0)&&(NewPiont.y<SIZE)&&(maze[NewPiont.x][NewPiont.y] == NewPiont.step )){
num[NewPiont.x][NewPiont.y] = num[NewPiont.x][NewPiont.y] + num[CurPiont.x][CurPiont.y];//将当前点的感染次数加上
}
//碰到 0 就感染,并将当前点的感染次数赋给新点的感染次数
if((NewPiont.x>=0)&&(NewPiont.x<SIZE)&&(NewPiont.y>=0)&&(NewPiont.y<SIZE)&&(maze[NewPiont.x][NewPiont.y] == 0)){
num[NewPiont.x][NewPiont.y] = num[CurPiont.x][CurPiont.y];//将当前点的感染次数赋给新点的感染次数
NewPiont.step = CurPiont.step+1;//step加1
maze[NewPiont.x][NewPiont.y] = NewPiont.step;//更新迷宫
enqueue(NewPiont);//新点入队
}
}
}
printf("**************");
printf("\n");
print1();//输出感染次数矩阵
}