【问题描述】
有一间长方形的房子,行数为m,列数为n,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
【输入形式】
第一行输入了4个数字m,n,x,y,m是长方形的行数,n是长方形的列数,x是出发位置的行数,y是出发位置的列数
下面有m行输入,代表了这个地图,其中 1 表示红色,0 表示黑色
每行每个数字之间都会用空格隔开
其中,1 <= m, n <= 100,坐标(x, y)处一定是黑色的瓷砖
注:左上角坐标为(0, 0)
【输出形式】一个数字,代表能够到达多黑色的瓷砖的数目
【样例输入】
6 12 3 5
1 1 1 1 1 0 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1 1 1
1 1 0 1 0 0 0 0 1 0 1 1
1 1 1 1 1 0 1 0 1 0 1 1
1 1 0 0 0 0 1 1 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1
【样例输出】11
【样例说明】从(3,5)出发,能够到达的黑色瓷砖共 11 个
#include<stdio.h>
int a[100][100]; //输入图像
int book[100][100], m, n, sum; //输入记录数组book,行m,列n,总数sum
void dfs(int x, int y) //定义深度优先搜索函数
{
int step[4][2] = { {0, 1}, //上
{1, 0}, //右
{0, -1}, //下
{-1, 0} }; //左
int k, tx, ty;
for (k = 0; k <= 3; k++)
{
tx = x + step[k][0];
ty = y + step[k][1]; //记录移动后位置
if (tx < 0 || tx > m-1 || ty < 0 || ty > n-1)
continue; //判断是否撞墙
if( a[tx][ty] == 0 && book[tx][ty] == 0)
{
sum++; //记录可行格子
book[tx][ty] = -1; //记为-1,视为走过
dfs(tx, ty); //重复
}
}
return;
}
int main()
{
int i, j, startx, starty;//输入循环辅助变量i,j; 初始位置 startx, starty
scanf("%d %d %d %d", &m, &n, &startx, &starty);//行,列,初始位置读入
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
book[startx][starty] = -1;//初始位置记为-1,视为走过
sum = 1; //记录可行格子
dfs(startx, starty);// 应用函数
printf("%d\n", sum);//输出
return 0;
}