MOOC 红与黑(深搜)

1:红与黑

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
样例输入
6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0
样例输出 45 思路:略。 出现的错误整理: 1.全局变量初始化。 brace-enclosed needed。 2.c = getchar();返回读入字符的ASCII值。(好久不打代码的代价TT) 3.注意遍历时边界为>=0,包括0在内。 4.getchar(吃回车)。 5.visited[][] reset。(chessboard不需reset,其值自动更新,且更新区域外不会访问到。)
#include<iostream>
using namespace std;
bool chessboard[1000][1000] = { 0 };
bool visited[1000][1000] = { 0 };

int DFS(int i, int j, int w, int h)
{
	int number = 1;

	visited[i][j] = 1;
	if ((i - 1) >= 0 && chessboard[i - 1][j] && !visited[i - 1][j])
	{
		number += DFS(i - 1, j, w, h);
	}
	if ((i + 1)<h&&chessboard[i + 1][j] && !visited[i + 1][j])
	{
		number += DFS(i + 1, j, w, h);
	}
	if ((j - 1) >= 0 && chessboard[i][j - 1] && !visited[i][j - 1])
	{
		number += DFS(i, j - 1, w, h);
	}
	if ((j + 1)<w&&chessboard[i][j + 1] && !visited[i][j + 1])
	{
		number += DFS(i, j + 1, w, h);
	}

	return number;
}

int main(void)
{
	int flag = 0, flag_x = 0, flag_y = 0;
	int w, h;
	char c;
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);	
	while (scanf("%d %d", &w, &h)) {//
		if (!w || !h)
			break;
		getchar();//
		for (int i = 0; i<h; i++)
		{
			for (int j = 0; j<w; j++)
			{
				if ((c = getchar()) == '.')
				{
					chessboard[i][j] = 1;
				}
				else if (c == '#')
				{
					chessboard[i][j] = 0;
				}
				else if (c == '@')
				{
					flag_x = i;
					flag_y = j;
					chessboard[i][j] = 1;
				}
			}
			getchar();//line break
		}
		cout << DFS(flag_x, flag_y, w, h) << endl;//

		for (int i = 0; i<h; i++)
		{
			for (int j = 0; j<w; j++)
			{
				visited[i][j] = 0;
			}
		}
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值