红与黑
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入描述:输入包含多组数据。每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:
- “.”:黑色的瓷砖;
- “#”:白色的瓷砖;
- “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
输出描述:
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
输入
输出: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;
}
来源:CSDN
作者:M-aaron
链接:https://blog.csdn.net/qq_43763344/article/details/97545243