大一C语言总结贴(持更) Part 14 黑色瓷砖

【问题描述】

有一间长方形的房子,行数为m,列数为n,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

【输入形式】

第一行输入了4个数字m,n,x,y,m是长方形的行数,n是长方形的列数,x是出发位置的行数,y是出发位置的列数

下面有m行输入,代表了这个地图,其中 1 表示红色,0 表示黑色

每行每个数字之间都会用空格隔开

其中,1 <= m, n <= 100,坐标(x, y)处一定是黑色的瓷砖

注:左上角坐标为(0, 0)


【输出形式】一个数字,代表能够到达多黑色的瓷砖的数目

【样例输入】

red.png

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值