zoukankan      html  css  js  c++  java
  • 题解 CF377A Maze

    题解 CF377A Maze

    题意简述

    给出一个迷宫图,堵上其中的 (k) 个点,使得剩下的路是一条通路。把被修改的点标记为 'X' ,输出整个图。

    题目思路

    (dfs) ,因为要堵上一些点,使得剩下的为一条通路,我们可以反着操作。

    先记所有的 ' . ' 的个数为 (sum) ,因为堵住的点数为 (k) ,则可以求出能走的点数为 (sum-k)

    我们可以走出一条以 (sum-k) 为路径长度的通路,那么剩下的 ' . ' 就为被堵住的路了。

    根据 (dfs) 走迷宫则可以写出代码。详见代码部分。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #define ll long long
    using namespace std;
    
    ll n,m,k;
    char ch[501][501];
    bool vis[501][501];
    int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};//dfs走迷宫必备
    int sum=0; //用来统计'.'的个数
    
    void dfs(int x,int y)
    {
    	if(!k) return;
    	for(int i=0; i<4; ++i) //dfs走迷宫板子
    	{
    		int nx=dx[i]+x;
    		int ny=dy[i]+y;
    		if(nx>n || ny>m || nx<1 || ny<1) continue;
    		if(ch[nx][ny]=='#' || vis[nx][ny]==1 || k<=0) continue;
    		vis[nx][ny]=1;
    		k--;//每走一格,剩余能走的步数-1
    		dfs(nx,ny);
    	}
    }
    
    int main()
    {
    	n=read();m=read();k=read();
    	for(int i=1; i<=n; ++i)
    	{
    		for(int j=1; j<=m; ++j)
    		{
    			cin>>ch[i][j];
    			if(ch[i][j]=='.') sum++; //统计'.'的个数
    		}
    	}
    	k=(sum-k)-1; //计算出可以走的格子数
    	for(int i=1; i<=n; ++i)
    		for(int j=1; j<=m; ++j)
    		{
    			if(ch[i][j]=='.')
    			{
    				vis[i][j]=1;//起点的 vis 设为1
    				dfs(i,j);
    				goto pri; //这里,只要进行完了 dfs 之后就跳到下面
    			}
    		}
    
    	pri:; //跳转到这里
    	for(int i=1; i<=n; ++i) //输出操作
    	{
    		for(int j=1; j<=m; ++j)
    		{
    			if(ch[i][j]=='#') cout<<'#';
    			else if(ch[i][j]=='.')
    			{
    				if(vis[i][j]==1) cout<<".";
    				else cout<<"X";
    			}
    		}
    		cout<<endl;
    	}
        return 0;
    }
    
  • 相关阅读:
    MVC总结
    HTML+CSS总结
    常用正则表达式
    从你的全世界切过(胡说八道支持向量机SVM小故事)
    Beta分布
    贝叶斯决策理论
    Linux(Ubuntu)下载安装破解Matlab2016
    贝叶斯规则
    多元分布
    条件分布
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/13927603.html
Copyright © 2011-2022 走看看