#include<bits/stdc++.h>
using namespace std; const int maxn = ;
char str[maxn][maxn];
int cntx[maxn], cnty[maxn],x[maxn],y[maxn]; int main(void){
int T,n,m;scanf("%d",&T);
while(T --){
scanf("%d%d",&n,&m);
int tot = ;
memset(cntx, , sizeof(cntx));
memset(cnty, , sizeof(cnty));
memset(x, -, sizeof(x));
memset(y, -, sizeof(y));
for(int i = ; i < n; i ++){
scanf("%s", str[i]);
for(int j = ; j < m; j ++){
if(str[i][j] == '#'){
cntx[i] ++;cnty[j] ++;
tot ++;
}else{
x[i] = j;y[j] = i;
}
}
}
long long ans = ;
for(int i = ; i < n; i ++)
for(int j = i + ; j < n; j ++)
ans += (long long)(j - i) * cntx[i] * cntx[j] * ;
for(int i = ; i < m; i ++)
for(int j = i + ; j < m; j ++)
ans += (long long)(j - i) * cnty[i] * cnty[j] * ; int cnt = ;
for(int i = ; i < n; i ++){
if(x[i] == -) cnt = ;
else if(i == || x[i] <= x[i - ]) cnt = x[i];
else cnt += x[i];
if(x[i] != -)
ans += 4LL * cnt * (m - x[i] - );
}
cnt = ;
for(int i = ; i < n; i ++){
if((i == )||(x[i] > x[i - ])||(x[i] == -)) cnt = m - x[i] - ;
else cnt += m - x[i] - ;
if(x[i] >= )
ans += 4LL * (cnt - m + x[i] + ) * (x[i]>?x[i]:);
} cnt = ;
for(int i = ; i < m; i ++){
if(y[i] == -) cnt = ;
else if(i == || y[i] <= y[i - ]) cnt = y[i];
else cnt += y[i]; ans += 4LL * cnt * (n - y[i] - );
}
cnt = ;
for(int i = ; i < m; i ++){
if((i == )||(y[i] > y[i - ])||(y[i] == -)) cnt = n - y[i] - ;
else cnt += n - y[i] - ;
if(y[i] >= )
ans += 4LL * (cnt - n + y[i] + ) * (y[i]>?y[i]:);
} printf("%.4lf\n",(double)ans/tot/tot);
}
return ;
}

Game (思维)的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. Photoshop、Illustrator思维导图笔记

    半年前学习Photoshop时记得的思维导图笔记,可能不是很全,常用的基本都记下了.

  3. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  4. 计算机程序的思维逻辑 (8) - char的真正含义

    看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...

  5. 计算机程序的思维逻辑 (29) - 剖析String

    上节介绍了单个字符的封装类Character,本节介绍字符串类.字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String. 字符串的基本使用是比 ...

  6. 计算机程序的思维逻辑 (31) - 剖析Arrays

    数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...

  7. 计算机程序的思维逻辑 (33) - Joda-Time

    Joda-Time上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Time,本节我们就来介绍Joda-Time.俗 ...

  8. 计算机程序的思维逻辑 (53) - 剖析Collections - 算法

    之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的. 都有哪些功能呢?大概可以分为两 ...

  9. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  10. "Becoming Functional" 阅读笔记+思维导图

    <Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...

随机推荐

  1. AT2046 Namori 图论

    正解: 解题报告: 传送门! 首先看数据范围可以发现要么是棵树要么是个奇环要么是个偶环 然后就分类讨论分别看下这几个情况 首先是棵树的 首先可以想到树的情况就是个二分图,所以不妨把颜色重定义,让奇数层 ...

  2. 【PyQt5-Qt Designer】QLineEdit 文本输入

    QLineEdit 文本输入 一.QlineEdit 基本方法 setAlignment() 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右 ...

  3. NOIP国王游戏

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  4. HSSF与XSSF导出excel文档

    Apache POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,它可以创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文 ...

  5. spring学习(03)之bean实例化的三种方式

    bean实体例化的三种方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(通常使用的一个方法,重点) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化 第一种.使用构 ...

  6. s3存储桶:s3可扩展的云存储

    S3(Simple Storage Service,简单存储服务),即可扩展的云存储,又称桶存储,S3 是一种面向 Internet 的存储服务.S3为任意类型的文件提供临时或永久的存储服务.用于存储 ...

  7. CAS缺点

      CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题.ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作 1.  ABA问题.因为CAS需要在操作值的时候检查下值有没有发生变化,如 ...

  8. PHP MYSQL 临时表的使用

    /** * 临时表:用于获取爱鸽登录分类数量 */ $temporaryTableName = uniqid('temporary_'); $model = M(); $model->execu ...

  9. struct模块

    struct模块的作用是将数据长度转换成固定长度的内容 一般默认是4个字节 需要注意的是,struct模块是有缺点的,就是struct的int类型或别的类型不是无限制的.当整数大于一定值后,会失败,即 ...

  10. [py]super调用父类的方法---面向对象

    super()用于调用父类方法 http://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. clas ...