2016 Multi-University Training Contest 1 C.Game
Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 588 Accepted Submission(s): 146
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.
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.
Round the answer to four decimals.
2 2
##
G#
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)
题意:问一个图中,在不经过障碍的前提下,随意选取起点终点的期望路径长度。
有一个条件,就是障碍物每行、每列只有一个,且一个障碍的八联通方格内不会有另一个障碍。
题解:
障碍物的条件使此题简单不少。
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的更多相关文章
- 2016 Al-Baath University Training Camp Contest-1
2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...
- 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 ...
- 2016 Al-Baath University Training Camp Contest-1 A
Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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, ...
随机推荐
- 工作中的一些JS--为网页动态添加元素,类似于邮箱添加联系人的功能
项目中要解决一个为下拉框动态添加选项的问题,之前从网上搜到结果,写个JS函数 //先新建元素,并添加属性 var option = document.createElement("optio ...
- 动力节点Java培训告诉你Java线程的多功能用法
现在的java开发可谓是八仙过海各显神通啊!遥想当下各种编程语言萎靡不振,而我Java开发异军突起,以狂风扫落叶之态,作为Java培训行业的黄埔军校,为了守护Java之未来,特意总结了一些不被人所熟知 ...
- 20145212&20145204信息安全系统实验五
一.实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/07_httpd目录,使用 vim编辑器或其他编辑器阅读理解源代码. 2.编译应用程序 运行 make 产生可执行文件 h ...
- morse code
morse code,摩斯电码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号. 摩斯电码,是一种早期的数字化通信形式,但是它不同于现代只使用0和1两种状态的二进制代 ...
- json 对象 字符串 转换
json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj);
- [NHibernate]一对多关系(关联查询)
目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...
- linuxmint 17安装qt5.3.1
从官方网站上下载的安装包,双击安装即可. 新建项目编译时,出现错误:cannot find -lGL 解决的方法:安装libgl1-mesa-dev,当然在安装时会安装其他的一些依赖包 在命令行中输入 ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- jquery.validate.js插件使用
jQuery验证控件jquery.validate.js使用说明+中文API 官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-valid ...
- 64位操作系统 通过ODP.NET 访问ORACLE 11g
摘要:64位操作系统部署.NET 程序访问oracle时,无法连接问题.(注意:客户端是64位系统 ,服务端是否64位 还是32位无关.) 1.到oracle 官网搜索相关版本的 ODAC网址: ht ...