Game

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 588    Accepted Submission(s): 146

Problem Description
  Sea5 and wzh are playing games.

There are some guards on an n × m chessboard. Every guard can attack eight cells around him and release shockwave to attack the whole row and column where he stand.

Sea5 and wzh are at the beginning stage of the game, they have already put some guards on the chess cells. No guards can be attacked by another guard right now. So they all fell asleep.

An innocent passer-by is on the chessboard. He can move to up, down, left or right from where he stands. The guards won’t attack him unless the passer-by move to where they stand. The innocent man may appear at any point on the chessboard and move to any point.

The innocent passer-by wants to know the average shortest distance of all the ways he can move without attacked by guards.

 
Input
  Multiple test cases.

The first line is an integer T(T≤50), the number of cases.

For each case, first line is two integers n and m(2≤n,m,≤1000).

The next n lines contain m symbols indicate the cells of chessboard. ‘G’ indicates a guard and ‘#’ indicates an empty cell.

 
Output
  One line per case, shortest distance of all the ways the passer-by can move without attacked by guards.

Round the answer to four decimals.

 
Sample Input
1
2 2
##
G#
 
Sample Output
0.8889

Hint

Ways of distance 0: 3
Ways of distance 1: 4
Ways of distance 2: 2
The answer is (3 * 0 + 1 * 4 + 2 * 2) / (3 + 4 + 2)

 
Author
HIT
 
Source
 
题意:问一个图中,在不经过障碍的前提下,随意选取起点终点的期望路径长度。
有一个条件,就是障碍物每行、每列只有一个,且一个障碍的八联通方格内不会有另一个障碍。

  

题解:
障碍物的条件使此题简单不少。
1、首先两个格子要么不会被阻碍(即最小距离为曼哈顿距离),要么只会绕行2的距离。
证明:
按照此种策略走即可:假设起点在左上方,终点在右下方,不影响结论。
那么,先优先往下走,若被阻挡则往右移动一个单位,再重复这个过程。
可以知道最后要么直接到达终点,要么停留在与终点同一条直线上(正上方或者正左方)。后者只需绕行距离2。 2、被阻挡的情形为 #S###
#####
#G###
#####
##G##
#####
###G#
###E# 即从S到E每一个竖列都有障碍。
其余情况可以有这种情况翻转得到。

  

 const int N = ;
int n, m;
char graph[N][N];
int onx[N], ony[N];
// onx -> The y coordinate of the guard on i x-coordinate
// ony -> The x coordinate of the guard on i y-coordinate inline ll manhattanTo(int x, int y) {
++x, ++y;
ll deltax = ( * x * x - * x + n * n - * n * x + n);
ll deltay = ( * y * y - * y + m * m - * m * y + m);
return deltax * m / + deltay * n / ;
} inline void init() {
clr(onx, -), clr(ony, -);
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j)
if(graph[i][j] == 'G') onx[i] = j, ony[j] = i;
} inline void upsidedown() {
for(int i = , _i = n - i - ; i < _i; ++i, --_i)
for(int j = ; j < m; ++j) swap(graph[i][j], graph[_i][j]);
init();
} inline void symmetryflip() {
int len = max(n, m);
for(int i = ; i < len; ++i)
for(int j = i; j < len; ++j) swap(graph[i][j], graph[j][i]);
swap(n, m);
init();
} inline ll work() {
// only work for these kind
// #G......
// ...G....
// ......G#
ll ret = ;
int lasty = -, cnt = ;
for(int i = ; i < n; ++i)
if(onx[i] == -) lasty = -, cnt = ;
else if(onx[i] > lasty) {
ret += cnt * 2ll * (m - onx[i] - );
lasty = onx[i], cnt += onx[i];
} else lasty = onx[i], cnt = onx[i];
return ret;
} inline void solve() {
init(); ll nm = n * m;
ll ans = (nm - ) * nm * (n + m) / ;
// cout << ans << endl; // The start point is guard
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j)
if(graph[i][j] == 'G') ans -= manhattanTo(i, j);
// The end point is guard
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j)
if(graph[i][j] == 'G') ans -= manhattanTo(i, j);
// Both start point and end point are guard
for(int i = ; i < n; ++i)
if(onx[i] != -) {
for(int j = ; j < n; ++j)
if(onx[j] != -) ans += abs(onx[i] - onx[j]);
}
for(int i = ; i < m; ++i)
if(ony[i] != -) {
for(int j = ; j < m; ++j)
if(ony[j] != -) ans += abs(ony[i] - ony[j]);
}
// cout << ans << endl; // Detour in one line
for(int i = ; i < n; ++i)
if(onx[i] != -) ans += 4ll * onx[i] * (m - onx[i] - );
for(int i = ; i < m; ++i)
if(ony[i] != -) ans += 4ll * ony[i] * (n - ony[i] - );
// Detour for block
// #..
// G..
// ...
// .G.
// ...
// ..G
// ..#
ans += 2ll * work();
upsidedown();
ans += 2ll * work();
symmetryflip();
ans += 2ll * work();
upsidedown();
ans += 2ll * work(); int noGuards = n * m;
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j)
if(graph[i][j] == 'G') --noGuards;
ll ways = noGuards * 1ll * noGuards; // cout << noGuards << endl;
// cout << ans << " " << ways << endl; printf("%.4lf\n", ans / (. * ways));
} int main() {
int testCase;
scanf("%d", &testCase);
while(testCase--) {
scanf("%d%d", &n, &m);
for(int i = ; i < n; ++i) scanf("%s", graph[i]);
solve();
}
return ;
}

2016 Multi-University Training Contest 1 C.Game的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  2. 2016 Al-Baath University Training Camp Contest-1 E

    Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...

  3. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  4. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  5. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  6. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  7. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

  8. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...

  9. 2016 Al-Baath University Training Camp Contest-1 D

    Description X is well known artist, no one knows the secrete behind the beautiful paintings of X exc ...

  10. 2016 Al-Baath University Training Camp Contest-1 C

    Description Rami went back from school and he had an easy homework about bitwise operations (and,or, ...

随机推荐

  1. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

  2. TypedReference

    http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-s ...

  3. ectouch 常用功能

    1. ectouch销量文件mobile\include\apps\default\common\function.php function get_goods_count($goods_id) { ...

  4. GIT本地配置和PUSH

    因为GIT使用的是LINUX命令,所以可以参考LINUX的相关命令 一.在本地配置好GIT仓库: 1.首先进入当前工程的目录:cd [filepath] (记住这里的目录应该用/,因为LINUX是这样 ...

  5. mui jquery 同时使用

    (function ($, doc, $$) { $.init(); $.ready(function () { var cityPicker = new $.PopPicker({ layer: } ...

  6. ThinkPHP 事务处理 (事务回滚) 、异常处理

    $tran_result = true;                $trans = M();                $trans->startTrans(); try {      ...

  7. 创立一个网站的前前后后(起因,域名,云平台,备案,CDN等等)(1)

    起因 写完<完美软件开发:方法与逻辑>这书后,原本想继续写书的,可出来参加了些社区活动后,我发现我写的书大家评价还行,但其实不太理解.而接下来想写的书更加抽象点,准备叫<管理的解析& ...

  8. Like与Instr模糊查询性能

    项目中用到like模糊查询,但是总觉的太小家子气,有没有高逼格的呢? instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 ...

  9. PHP写文件函数

    /** * 写文件函数 * * @param string $filename 文件名 * @param string $text 要写入的文本字符串 * @param string $openmod ...

  10. Linux/CentOS 服务安装/卸载,开机启动chkconfig命令详解|如何让MySQL、Apache开机启动?

    chkconfig chkconfig在命令行操作时会经常用到.它可以方便地设置和查询不同运行级上的系统服务.这个可要好好掌握,用熟练之后,就可以轻轻松松的管理好你的启动服务了. 注:谨记chkcon ...