zoukankan      html  css  js  c++  java
  • ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)

    1057: Beautiful Garden

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 25  Solved: 12
    [Submit][Status][Web Board]

    Description

    There's a beautiful garden whose size is  n  × m  in Edward's house. The garden can be 
    partitioned  into  n  ×  m  equal-sized  square  chunks.  There  are  some  kinds  of  flowers 
    planted in each square chunk which can be represented by using lowercase letters.
    However, Edward thinks the garden is not beautiful enough. Edward wants to build a 
    water  pool  in  the  garden.  So  that  the  garden  would  look  like  symmetric  (both 
    horizontally and vertically). The water pool is a rectangle whose size is  p  × q  and the 
    center of the water pool is also the center of the garden.
    Something else important you should know is:
      n, m, p and q are all even.
      p is always less than n.
      q is always less than m.
      The borders of the water pool are parallel to the border of garden.
    Edward wants to know how many different pairs of (p, q) he can choose.

    Input

    There are multiple test cases. The first line of input contains an integer  T  indicating 
    the number of test cases. For each test case:
    The first line contains two integers  n  and  m  (1 <=  n,  m  <= 2000,  n  and  m  are even), 
    indicating  the  size  of  the  garden.  For  next  n  lines,  each  line  contains  m  characters 
    showing the garden.
    It is guaranteed that only lowercase letters will appear.

    Output

    For  each  test  case,  output  an  integer  indicating  the  number  of  choices  to  build  the 
    water pool.

    Sample Input

    3
    6 8
    acbbbbca
    dcaccacd
    cdaddadc
    cdaddadc
    dcaccacd
    acbbbbca
    6 8
    acbcbbca
    dcaccacd
    cdaddadc
    cdaddadc
    dcaccacd
    acbbbbca
    6 8
    acbbbbca
    dcadcacd
    cdaddadc
    cdaddadc
    dcaccacd
    acbbbbca

    Sample Output

    6
    0
    3

    HINT

     

    For the first sample, you have following six choices (blank rectangle means the water 

    pool): 

    很蛋疼的一道题,需要仔细调试。还有具体怎么计算呢?若下标均从0开始,显然上面的可抹除部分有2行(1与2),3列(1,2,3),那么答案就是2*3,其他情况均用这种办法求解。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    char pos[2009][2009];
    int hang,lie;
    inline bool huiwen(const char s[])
    {
    	int len=strlen(s);
    	int i;
    	for (i=0; i<len/2;i++)
    	{
    		if(s[i]!=s[len-1-i])
    			return false;
    	}
    	return true;
    }
    int main(void)
    {
    	int t,i,j,l,r;
    	scanf("%d",&t);
    	while (t--)
    	{
    		memset(pos,0,sizeof(pos));
    		scanf("%d%d",&hang,&lie);
    		for (i=0; i<hang; i++)
    		{
    			scanf("%s",pos[i]);
    		}
    		l=hang/2-1;
    		r=lie/2-1;
    		for (i=0; i<hang/2; i++)//判断上下是否相同且回文
    		{
    			if( (strcmp(pos[i],pos[hang-1-i])!=0) || (!huiwen(pos[i])) || (!huiwen(pos[hang])))
    			{
    				l=i;
    				break;
    			}
    		}
    		bool ok=0;
    		for (i=0; i<lie/2; i++)//列相同判断
    		{
    			for (j=l; j<=hang-1-l; j++)
    			{
    				if(pos[j][i]!=pos[j][lie-1-i])
    				{
    					r=i;
    					ok=1;
    					break;
    				}
    			}
    			if(ok)
    				break;
    		}		
    		for (i=0; i<r; i++)//列回文判断(放到上面的for里十分麻烦,独立出来判断)
    		{
    			for (j=l; j<hang/2; j++)
    			{
    				if(pos[j][i]!=pos[hang-1-j][i])
    				{
    					r=min(r,i);//肯定要取小的那列
    					ok=1;
    					break;
    				}
    			}
    			if(ok)
    				break;
    		}
    		printf("%d
    ",l*r);//输出答案
    	}
    	return 0;
    }
  • 相关阅读:
    DeepLearning.ai学习笔记汇总
    Coursera深度学习(DeepLearning.ai)编程题&笔记
    DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
    Andrew Ng机器学习课程笔记--汇总
    Andrew Ng机器学习课程笔记--week3(逻辑回归&正则化参数)
    Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
    C++学习笔记之模板篇
    【GAMES101-现代计算机图形学课程笔记】Lecture 10 Geometry 1 (介绍)
    GAMES201:高级物理引擎实战指南-Lecture 1 Taichi编程语言介绍
    【GAMES101-现代计算机图形学课程笔记】Lecture 09 Shading 3 (纹理映射)
  • 原文地址:https://www.cnblogs.com/Blackops/p/5356388.html
Copyright © 2011-2022 走看看