C++红与黑/蘑菇阵

红与黑

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

输入包含多组数据。

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

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

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

输出 : 45

解法一:dfs(深度优先)

#include<iostream>
#include<vector>
using namespace std;
int n,m;
void dfs(vector<vector<int>>& dp, int x, int y,int& res) {
    
    
    if (x < 0 || x > a-1 || y < 0 || y > b - 1|| dp[x][y] == '#') {
    
    
        return ;
    }
    res++;
    dp[x][y] = '#';
    operBlackNumbers(dp, x, y + 1);
    operBlackNumbers(dp, x + 1, y);
    operBlackNumbers(dp, x - 1, y);
    operBlackNumbers(dp, x, y - 1);
}
int main()
{
    
    
	while(cin >> n >> m){
    
    
	   int x = 0,y = 0,res = 0;
	   vector<vector<char>> dp(n,vector<char>(m));
	   for(size_t i = 0; i < n;i++){
    
    
		   for(size_t j = 0; j < m;j++){
    
    
			    cin >> dp[i][j];
			    if(dp[i][j] == '@'){
    
    
					x = i;
					y = j;
			    }
			}
		}
		dfs(dp,x,y,res);
		cout << res << endl;
	}
	return 0;
}

解法二:bfs(广度优先)

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PAR;
int n,m;
void bfs(vector<vector<int>>& dp, int x, int y,int& res)
{
    
    
    queue<PAR> que;
    que.push(make_pair(x,y));
    dp[x][y] = 1;
    int dit[4][2] = {
    
     {
    
    -1,0},{
    
    0,-1},{
    
    1,0},{
    
    0,1} };
    res++;

    while (!que.empty()) {
    
    
        PAR pnums = que.front();
        que.pop();
        for (int i = 0; i < 4; i++) {
    
    
            int startx = pnums.first + dit[i][0];
            int starty = pnums.second + dit[i][1];
            if (startx >= 0 && startx < n && starty >= 0 && starty < m &&\
             dp[startx][starty] == '.') {
    
    
                res++;
                que.push(make_pair(startx, starty));
                dp[startx][starty] = '#';
            }
        }
    }


}

int main()
{
    
    
	while(cin >> n >> m){
    
    
	   int x = 0,y = 0,res = 0;
	   vector<vector<char>> dp(n,vector<char>(m));
	   for(size_t i = 0; i < n;i++){
    
    
		   for(size_t j = 0; j < m;j++){
    
    
			    cin >> dp[i][j];
			    if(dp[i][j] == '@'){
    
    
					x = i;
					y = j;
			    }
			}
		}
		bfs(dp,x,y,res);
		cout << res << endl;
	}
	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位小数)

示例1:
输入
2 2 1
2 1

输出
0.50

int main()
{
    
    
	int n = 0, m = 0;
	vector<vector<int>> nums(n+1, vector<int>(m+1));
	vector<vector<double>> dp(n+1, vector<double>(m+1));
	for(int i = 0;i < k;i++){
    
    
			cin >> x >> y;
			nums[x][y] = 1;
	}
	dp[1][1] = 1.0;
	for (int i = 1; i <= n; i++)
	{
    
    
		for (int j = 1; j <= m; j++)
		{
    
    
			if (!(i == 1 && j == 1))
				dp[i][j] = dp[i - 1][j] * (j == 2 ? 1 : 0.5) +
				dp[i][j - 1] * (i == 2 ? 1:0.5);
			if (nums[i][j] == 1)
				dp[i][j] = 0;
		}
	}
	printf("%.2f\n", dp[n][m]);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_54792212/article/details/125881008