题目

给定一个n行m列的字符矩阵,’.’代表空地,’X’代表障碍。移动的规则是:每秒钟以上下左右四个方向之一移动一格,不能进入障碍。

计算:在空地中随机选择起点和终点(可以重合,此时最短耗时为0),从起点移动到终点最短耗时的平均值。

每一行每一列至多有1个障碍,并且障碍不在对角线方向相邻。以下矩阵是不合法的:

.X

X.

分析

50%的数据,全都是空地,答案就是所有两点间的曼哈顿距离和。

很容易求,\({第i行空地的数量}*{第j行空地的数量}*|i-j|*2\)

因为每一行每一列至多有1个障碍,并且障碍不在对角线方向相邻。得出从A走到B的耗时,要么等于AB的曼哈顿距离,要么等于AB的曼哈顿距离+2。

现在考虑什么情况下距离加二。

观察下图,规律显而易见,我就不多说了,

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=1005;
using namespace std;
int a[N][N],n,m,sum,sx[N],sy[N],xx[N],xy[N];
double ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char c=getchar();
while(c!='.' && c!='X') c=getchar();
if(c=='.')
{
sx[i]++;
sy[j]++;
sum++;
}
else
{
xx[i]=j;
xy[j]=i;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans+=abs(i-j)*sx[i]*sx[j]*1.0/sum/sum;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
ans+=abs(i-j)*sy[i]*sy[j]*1.0/sum/sum;
for(int i=1;i<=n;i++)
if(xx[i])
{
int mn=maxlongint,mx=-1;
for(int j=i;j>=1;j--)
{
if(xx[j]>mx && xx[j])
{
ans+=1.0*(xx[i]-1)*(m-xx[j])*2/sum/sum;
mx=xx[j];
}
else
break;
}
for(int j=i;j>=1;j--)
{
if(xx[j]<mn && xx[j])
{
ans+=1.0*(xx[j]-1)*(m-xx[i])*2/sum/sum;
mn=xx[j];
}
else
break;
}
mn=xx[i],mx=xx[i];
for(int j=i+1;j<=n;j++)
{
if(xx[j]>mx && xx[j])
{
ans+=1.0*(xx[i]-1)*(m-xx[j])*2/sum/sum;
mx=xx[j];
}
else
break;
}
for(int j=i+1;j<=n;j++)
{
if(xx[j]<mn && xx[j])
{
ans+=1.0*(xx[j]-1)*(m-xx[i])*2/sum/sum;
mn=xx[j];
}
else
break;
}
}
for(int i=1;i<=m;i++)
if(xy[i])
{
int mn=maxlongint,mx=-1;
for(int j=i;j>=1;j--)
{
if(xy[j]>mx && xy[j])
{
ans+=1.0*(xy[i]-1)*(n-xy[j])*2/sum/sum;
mx=xy[j];
}
else
break;
}
for(int j=i;j>=1;j--)
{
if(xy[j]<mn && xy[j])
{
ans+=1.0*(xy[j]-1)*(n-xy[i])*2/sum/sum;
mn=xy[j];
}
else
break;
}
mn=xy[i],mx=xy[i];
for(int j=i+1;j<=m;j++)
{
if(xy[j]>mx && xy[j])
{
ans+=1.0*(xy[i]-1)*(n-xy[j])*2/sum/sum;
mx=xy[j];
}
else
break;
}
for(int j=i+1;j<=m;j++)
{
if(xy[j]<mn && xy[j])
{
ans+=1.0*(xy[j]-1)*(n-xy[i])*2/sum/sum;
mn=xy[j];
}
else
break;
}
}
printf("%.4lf",ans);
}

【NOIP2012模拟10.25】旅行的更多相关文章

  1. 【NOIP2012模拟10.25】剪草

    题目 有N棵小草,编号0至N-1.奶牛Bessie不喜欢小草,所以Bessie要用剪刀剪草,目标是使得这N棵小草的高度总和不超过H.在第0时刻,第i棵小草的高度是h[i],接下来的每个整数时刻,会依次 ...

  2. 【NOIP2012模拟10.25】单元格

    题目 在一个R行C列的表格里,我们要选出3个不同的单元格.但要满足如下的两个条件: (1)选中的任意两个单元格都不在同一行. (2)选中的任意两个单元格都不在同一列. 假设我们选中的单元格分别是:A, ...

  3. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  4. 【NOIP2012模拟10.31】掷骰子

    题目 太郎和一只免子正在玩一个掷骰子游戏.有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时 ...

  5. 10.25 正睿停课训练 Day9

    目录 2018.10.25 正睿停课训练 Day9 A 数独(思路 DP) B 红绿灯(最短路Dijkstra) C 轰炸(计算几何 圆并) 考试代码 B C 2018.10.25 正睿停课训练 Da ...

  6. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  7. 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command)

    [源码下载] 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command) 作者:webabcd 介绍背水一战 Windows 10 之 MVV ...

  8. /proc/interrupts 统计2.6.38.8与3.10.25差异

    eth4进,eth5出 linux-3.10.25 67:          2          3          2          3   PCI-MSI-edge     eth468: ...

  9. CentOS安装NodeJS v0.10.25 + Express

    安装必需组件 yum -y install gcc make gcc-c++ openssl-devel wget cd ~wget http://nodejs.org/dist/v0.10.25/n ...

随机推荐

  1. java:struts框架4(Ajax)

    1.Ajax: 先导入jar包: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!D ...

  2. Unity旋转问题的总结

    1.物体的直接旋转 transform.Rotate();这个函数是在当前状态下网某个方向旋转.并且这里可以设置为世界空间或者自身空间. transform.rotation;这里可以通过直接定义一个 ...

  3. 【Deep Learning Nanodegree Foundation笔记】第 5 课:Logistic Regression

    Learn about linear regression and logistic regression models. These simple machine learning models a ...

  4. python中用*和**解析数据

    在python中可以用*解析tuple,list,set数据给函数传参,用**解析dict类型数据,这样可使代码更加简洁. 示例代码: def func(a,b,c): print('a:{0},b: ...

  5. 双系统正确卸载Ubuntu系统

    双系统正确卸载Ubuntu系统  安装系统后由于显卡驱动问题,无法开机,从而只能卸载重装,重装过程如下. 第一步:下载需要的工具包,这里我用的是MBRfix, 可以直接从我分享的网盘链接下载,密码gw ...

  6. 【VS开发】浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

    UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

  7. https原理以及golang基本实现

    关于https 背景知识 密码学的一些基本知识 大致上分为两类,基于key的加密算法与不基于key的加密算法.现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使 ...

  8. TCP listener

    调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...

  9. laravel框架之批刪&全選&全不選&反選

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. vue中出现 There are multiple modules with names that only differ in casing的问题

    import时,文件引入的路径描述不统一,所以保留一种引入风格即可解决. 第一种,我选择统一用第一种 import GoTop from '@/components/layout/goTop' 第二种 ...