首页 > 其他 > 详细

ZOJ 2975 思维

时间:2016-04-16 23:12:49      阅读:368      评论:0      收藏:0      [点我收藏+]

题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的 

一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了

后来想了想 当我们已经确定两个列数的时候 向下寻找的时候 如果找到了tot条边与第一条边同字母 这些边可以组成(tot-1)*tot个矩形 使满足题意

为了避免重复寻找 需要一个map来记录 由于矩形的边最长100 我们存已经检索的字母*1000*1000+左列数*1000+右列数

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<map>
using namespace std;
int n,m;
char a[300][300];
int main(){
    int t;
    scanf("%d",&t);
    while(t--)
    {
        map<int ,int >q;
        q.clear();
        int sum=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        scanf("%s",a[i]+1);
        for(int i=1;i<=n-1;i++)
        {
            for(int k=1;k<=m-1;k++)
            {
                for(int j=k+1;j<=m;j++)
                {
                    if(a[i][k]!=a[i][j])
                    continue;
                    int x=a[i][k]-‘A‘;
                    if(q[x*1000000+k*1000+j]!=0)
                    continue;
                    int tot=1;
                    for(int l=i+1;l<=n;l++)
                    {
                        if(a[l][j]==a[l][k]&&a[l][j]==a[i][j])
                        {
                            tot++;
                            q[x*1000000+k*1000+j]=1;
                        }
                    }
                    sum+=(tot-1)*tot/2;
                }
            }
        }
        printf("%d\n",sum);
    }
}

  

ZOJ 2975 思维

原文:http://www.cnblogs.com/rayrayrainrain/p/5399661.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!