【华为OD】C卷真题 200分 100%通过:欢乐的周末 C/C++实现【思路+代码】

题目描述:

小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?

输入描述:

 
  

第一行输入m和n,m代表地图的长度,n代表地图的宽度。

第二行开始具体输入地图信息,地图信息包含:

0 为通畅的道路

1 为障碍物(且仅1为障碍物)

2 为小华或者小为,地图中必定有且仅有2个 (非障碍物)

3 为被选中的聚餐地点(非障碍物)

输出描述:

可以被两方都到达的聚餐地点数量,行末无空格。

示例1输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4 4
2 1 0 3
0 1 2 1
0 3 0 0
0 0 0 0

输出

2

说明

 
  

第一行输入地图的长宽为3和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

此时两者能都能到达的聚餐位置有2处

示例2输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4 4
2 1 2 3
0 1 0 0
0 1 0 0
0 1 0 0

输出

0

说明

 
  

第一行输入地图的长宽为4和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

由于图中小华和小为之间有个阻隔,此时,没有两人都能到达的聚餐地址,故而返回0

备注:

 
  

地图的长宽为m和n,其中:

4 <= m <= 100

4 <= n <= 100

聚餐的地点数量为 k,则 

1< k <= 100

     668                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   |  +   |        +
  |      +    | +      |   +   +----+        |   |          +   |  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   |  +   |        +
  |      +    | +      |   +   +    +        |   |          +   |  +   |        +
  |      +---+ |     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     |     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     |     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     |     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     |     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  |0 |         |         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目解析:

                使用递归的方式来实现即可

代码实现:

#include 
#include 
#include 
using namespace std;


using Grid = vector>;
Grid cacheData(100, vector(100));

int getResult()
{
	int data = 0;
	for (const auto & i : cacheData)
	{
		data += std::count(i.begin(), i.end(), 2);
	}
	return data;
}


int rowCount = 0;
int colCount = 0;

bool isValid(int x, int y, int val)
{
	return x < 0 || x >= rowCount || y < 0 || y >= colCount;
}

vector colOffset = { 0, 1, 0, -1 };
vector rowOffset = { 1, 0, -1, 0 };
void updateData(Grid &grid, int x, int y, int value)
{
	if (isValid(x, y, value))
	{
		return;
	}

	int info = grid[x][y];
	if (info == 1|| info == -1)
	{
		return;
	} 
	else if (info == 0x3)
	{
		if (cacheData[x][y] == value) {
			cacheData[x][y] += 1;
		}
	}

	grid[x][y] = -1;
	for (int i = 0; i < colOffset.size(); ++i) {
		updateData(grid, x + rowOffset[i], y + colOffset[i], value);
	}
}

void calc(Grid temp, int i, int j, int n)
{
	for (int k = 0; k < 4; ++k) {
		updateData(temp, i + rowOffset[k], j + colOffset[k], n);
	}
}

void readData(Grid &grid)
{
	for (int i = 0; i < rowCount; ++i)
	{
		for (int j = 0; j < colCount; ++j)
		{
			cin >> grid[i][j];
		}
	}
}

void analyze(Grid data);

int main()
{
	Grid data(cacheData);
	cin >> rowCount;
	cin >> colCount;
	readData(data);
	analyze(data);
	cout << getResult() << endl;
	return 0;
}

void analyze(Grid data)
{
	int num = 0;
	for (int i = 0; i < rowCount; ++i)
	{
		for (int j = 0; j < colCount; ++j)
		{
			if (data[i][j] == 2)
			{
				calc(data, i, j, num++);
			}
		}
	}
}

【华为OD】C卷真题 200分 100%通过:欢乐的周末 C/C++实现【思路+代码】_第1张图片

你可能感兴趣的:(杂谈,算法,华为od,c语言,javascript,java,c++,python)