红与黑问题(队列实现)
描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
1.输入一个二维数组,规则如下
( 1)“1”代表黑色的瓷砖;
(2)‘0“代表红色的瓷砖;
2.输入一个起点
输出
输出所有联通的瓷砖的位置以及瓷砖数量
样例输出
请输入红与黑矩阵:
0 0 0 0 0 0
0 1 1 1 0 0
0 0 0 1 0 0
0 0 0 1 1 0
0 1 1 1 0 0
0 0 0 0 0 0
请输入起始点的坐标:
1 2
样例输出
与起始位联通的点的坐标为:
1 2
1 3
1 1
2 3
3 3
3 4
4 3
4 2
4 1
与起始位联通的点的个数为:9
#include "stdafx.h"
#define M 50
typedef struct {//定义队列结构体
int data[M];
int front,rear;
}sequeue;
int main(int argc, char* argv[])
{
int count=0;//定义count记录联通的点的个数
int k=0;
int i,j,x,y;
int a[6][6];//定义二维数组作为迷宫
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//定义方向数组
sequeue sx;//创建sx队列储存点的x坐标
sx.front=sx.rear=0;//队列初始化
sequeue sy;//创建sy队列储存点的y坐标
sy.front=sy.rear=0;
printf("请输入红与黑矩阵:\n");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("请输入起始点的坐标:\n");
scanf("%d%d",&x,&y);
if(a[x][y]==1)
{
printf("与起始位联通的点的坐标为:\n");
a[x][y]=0; //将起始点置0
sx.data[sx.rear++]=x;//起始点x坐标入队
sy.data[sy.rear++]=y;起始点y坐标入队
count++;
while(sx.rear>sx.front){//队不空时
int e=sx.data[sx.front++];//值为1 点的x,y坐标出队
int f=sy.data[sy.front++];
printf("%d %d\n",e,f);//打印所有出队的点的坐标
while(k<4){//检查该点的上下左右四个方向
int c=e+dx[k];
int d=f+dy[k];
if(a[c][d]==1){//值为1 则将该点的坐标入队
sx.data[sx.rear++]=c;
sy.data[sy.rear++]=d;
a[c][d]=0;//入队后将改点置0
count++;//记录值为1 的点的个数
}
k++;
}
k=0;//k置0
}
printf("与起始位联通的点的个数为:");
printf("%d\n",count);
}
else
{
printf("起始点的值不为1!\n");
}
return 0;
}`