zoukankan      html  css  js  c++  java
  • [CF1495C] Garden of the Sun

    前言

    虚拟赛。D WA了九发,靠二十多分钟切掉这道题翻盘。

    题目

    CF

    洛谷

    题目大意:

    (t) 组数据,每组数据给一个 (n)(m) 列的矩阵,其中只包含 X.。你需要把 . 改成 X,使得所有的 X 构成一棵树。

    保证初始的 X 两两没有公共点。

    (1le tle 10^4;1le n,mle 500;sum ncdot mle 250000.)

    讲解

    直接给出方法:

    每空两行全部变成 X 。显然此时没有环,但也不联通,大概长这个样子:

    然后我们把每相邻两行之间都挑一个突出的枝头使上下连起来:

    注意不要忘了最下面可能会有单点,以及每相邻两行之间没有枝头的情况。

    此时显然连通,而且由于初始 X 两两没有公共点,所以也不会出现环。

    代码

    int main()
    {
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	for(int T = Read(); T ;-- T)
    	{
    		n = Read(); m = Read();
    		for(int i = 1;i <= n;++ i) scanf("%s",a[i]+1);
    		for(int i = 1;i <= n;i += 3)
    			for(int j = 1;j <= m;++ j) a[i][j] = 'X';
    		if((n-1) % 3 == 2)
    			for(int j = 1;j <= m;++ j)
    				if(a[n][j] == 'X') a[n-1][j] = 'X';
    		for(int i = 2;i <= n;i += 3)
    		{
    			bool f = 1;
    			for(int j = 1;j <= m && f;++ j)
    				if(a[i][j] == 'X')
    				{
    					f = 0;
    					a[i+1][j] = 'X';
    				}
    			if(i+1 > n) break;
    			for(int j = 1;j <= m && f;++ j)
    				if(a[i+1][j] == 'X')
    				{
    					f = 0;
    					a[i][j] = 'X';
    				}
    			if(f) a[i][1] = a[i+1][1] = 'X';
    		}
    		for(int i = 1;i <= n;++ i,putchar('
    '))
    			for(int j = 1;j <= m;++ j)
    				putchar(a[i][j]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    第一个WPF
    redis pub/sub 发布订阅
    php中header函数后是否应该有exit
    redis的图形界面管理工具
    redis key和value数据类型
    螺旋式打印一个二维数组
    jquery 提示插件 cluetip
    php异常处理
    ruby Methods, Procs, Lambdas, and Closures
    ruby迭代器iterator和枚举器Enumerator
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/14799285.html
Copyright © 2011-2022 走看看