044 红与黑 蘑菇阵

不羁岁月 提交于 2019-12-04 05:17:34

红与黑

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

输入描述:输入包含多组数据。每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:

  1. “.”:黑色的瓷砖;
  2. “#”:白色的瓷砖;
  3. “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

输出描述:
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
输入
在这里插入图片描述
输出:45

解题思路:下图就是这道题的原型,灰色的也代表黑色,是人物站立的地方,所求的结果是黑色方块连接的块数一共是多少个?
在这里插入图片描述
采用的是深度优先搜索方法

#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
#include <math.h>
#include <queue>
#include <fstream>
using namespace std;

class pos {
public:
	int x;
	int y;
};

int bfs(vector<vector<char>>&map, 
	vector<vector<bool>>&visit, pos& start)
{
	int count = 0;
	queue<pos>que;
	const int dit[4][2] = {
		{-1,0},//下
		{1,0},//上
		{0,-1},//左
		{0,1}//右
	};
	int m = map.size();
	int n = map[0].size();
	//首先插入起始位置
	que.push(start);
	++count;
	//每次走完走要设置一个 true,代表此位置已经走过了
	visit[start.x][start.y] = true;

	while (!que.empty()){
		pos cur = que.front(), next;
		que.pop();
		//循环四次是因为有四个方向
		for (int i = 0; i < 4; ++i){
			next.x = cur.x + dit[i][0];
			next.y = cur.y + dit[i][1];
			if (next.x >= 0 && next.x < m && next.y >= 0 && next.y < n 
				&& !visit[next.x][next.y] && map[next.x][next.y] == '.')
			{
				que.push(next);
				++count;
				//每次走完走要设置一个 true,代表此位置已经走过了
				visit[next.x][next.y] = true;
			}
		}
	}
	return count;
}

int main() {
	int m, n;
	while (cin >> m >> n && m*n) {
		pos start;
		vector<vector<char>>map(m, vector<char>(n));
		vector<vector<bool>>visit(m, vector<bool>(n));
		for (int i = 0; i < m; ++i) {
			for (int j = 0; j < n; ++j) {
				//初始化所有的格子为false
				visit[i][j] = false;
				cin >> map[i][j];
				if (map[i][j]=='@') {
					start.x = i;
					start.y = i;
				}
			}
			cout << bfs(map, visit, start) << endl;
		}
	}
	system("pause");
	return 0;
}

蘑菇阵

现在有两个好友 A 和 B ,住在一片长有蘑菇的由 n*m 个方格组成的草地,A 在(1,1), B 在( n , m ) 现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有 k 个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?

输入描述:第一行N,M,K(1 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。

输出描述:输出一行,代表所求概率(保留到2位小数)

输入
2 2 1
2 1
输出 0.50

int main() {
	int n, m, k;
	while (cin >> n >> m>> k) {
		vector<vector<int>>table(n + 1, vector<int>(m + 1));
		vector<vector<double>>P(n + 1, vector<double>(m + 1));
		//输入蘑菇的位置
		int x, y;
		for (int i = 0; i < k; ++i) {
			cin >> x >> y;
			table[x][y] = 1;
		}

		P[1][1] = 1.0; //起点概率为1
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++){
				//跳过起点
				if (!(i == 1 && j == 1)) { 
					P[i][j] = P[i - 1][j] * (j == m ? 1 : 0.5) + 
						P[i][j - 1] * (i == n ? 1 : 0.5); 

					//边界的时候,概率为1
					if (table[i][j] == 1) {
						//如果该点有蘑菇,概率置为0
						P[i][j] = 0;
					}
				}
			}
		}

		//fixed 设置的是格式,setprccision(2)意思是保留两位小数
		cout << fixed << setprecision(2) << P[n][m] << endl;
		printf("%.2f", P[n][m]);
	}

	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!