2013 ACM/ICPC 南京网络赛F题
题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1。从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分。构成几个得几分,最终完成九宫格时,谁的分高谁赢。现在给出两人前若干步的操作,问接下来两人都采取最优策略的情况下,谁赢。
分析:博弈搜索,有人说要加记忆化,我没有加也过了……与赤裸裸的博弈搜索的区别在于对于最终状态,并不是谁无路可走谁输,而是谁分低谁输。注意判断分数相等的情况。在搜索中每个节点要么是必胜态,要么是必败态,可参见这里对NP问题的描述:http://www.cnblogs.com/rainydays/archive/2011/05/27/2059781.html
边的存储与判断不好处理,我是使用了edge_row[ ][ ]数组来存储横向边,edge_col[ ][ ]来存储纵向边。并用其左边(横向)或上边(纵向)的点来代表这条边。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; struct Point
{
int x, y;
Point()
{}
Point(int x, int y):x(x), y(y)
{}
}; bool edge_row[][];
bool edge_col[][];
bool tom_turn;
int edge_num;
int tom_score, jerry_score; Point get_point(int a)
{
return Point((a - ) / , (a - ) % );
} void add_edge(Point a, Point b, bool value)
{
if (a.x > b.x || a.y > b.y)
swap(a, b);
if (a.x == b.x)
edge_row[a.x][a.y] = value;
else
edge_col[a.x][a.y] = value;
} int square(Point a)
{
if (a.x < || a.y < || a.x > || a.y > )
return ;
bool ret = true;
ret = ret && edge_row[a.x][a.y];
ret = ret && edge_col[a.x][a.y];
ret = ret && edge_row[a.x + ][a.y];
ret = ret && edge_col[a.x][a.y + ];
if (ret)
return ;
return ;
} int get_score(Point a, Point b)
{
if (a.x > b.x || a.y > b.y)
swap(a, b);
if (a.x == b.x)
return square(Point(a.x - , a.y)) + square(a);
return square(Point(a.x, a.y - )) + square(a);
} void input()
{
tom_turn = true;
tom_score = jerry_score = ;
scanf("%d", &edge_num);
memset(edge_row, , sizeof(edge_row));
memset(edge_col, , sizeof(edge_col));
for (int i = ; i < edge_num; i++)
{
int a, b;
scanf("%d%d", &a, &b);
Point p1 = get_point(a);
Point p2 = get_point(b);
add_edge(p1, p2, true);
if (tom_turn)
tom_score += get_score(p1, p2);
else
jerry_score += get_score(p1, p2);
tom_turn = !tom_turn;
}
} bool dfs(int next_score, int previous_score, bool tom_turn)
{
bool win = false;
bool did = false;
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (!edge_row[i][j])
{
did = true;
Point a = Point(i, j);
Point b = Point(i, j + );
add_edge(a, b, true);
int score = get_score(a, b);
win = !dfs(previous_score, next_score + score, !tom_turn);
add_edge(a, b, false);
if (win)
return true;
}
if (!edge_col[j][i])
{
did = true;
Point a = Point(j, i);
Point b = Point(j + , i);
add_edge(a, b, true);
int score = get_score(a, b);
win = !dfs(previous_score, next_score + score, !tom_turn);
add_edge(a, b, false);
if (win)
return true;
}
}
}
if (!did)
{
if (next_score == previous_score)
return !tom_turn;
return next_score > previous_score;
}
return false;
} int main()
{
int case_num;
scanf("%d", &case_num);
for (int i = ; i <= case_num; i++)
{
input();
bool tom_win;
if (tom_turn)
tom_win = dfs(tom_score, jerry_score, tom_turn);
else
tom_win = !dfs(jerry_score, tom_score, !tom_turn);
printf("Case #%d: ", i);
if (tom_win)
printf("Tom200\n");
else
printf("Jerry404\n");
}
return ;
}
2013 ACM/ICPC 南京网络赛F题的更多相关文章
- 2013 ACM/ICPC 长春网络赛F题
题意:两个人轮流说数字,第一个人可以说区间[1~k]中的一个,之后每次每人都可以说一个比前一个人所说数字大一点的数字,相邻两次数字只差在区间[1~k].谁先>=N,谁输.问最后是第一个人赢还是第 ...
- 2013 ACM/ICPC 长沙网络赛J题
题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...
- 2013 ACM/ICPC 长春网络赛E题
题意:给出一个字符串,要从头.尾和中间找出三个完全相等的子串,这些串覆盖的区间互相不能有重叠部分.头.尾的串即为整个字符串的前缀和后缀.问这个相同的子串的最大长度是多少. 分析:利用KMP算法中的ne ...
- 2013 ACM/ICPC 杭州网络赛C题
题意:驴和老虎,在一个矩阵的两个格子里,有各自的起始方向.两者以相同的速度向前移动,前方不能走时驴总是向右,老虎总是向左.他们不能超出矩阵边界也不能走自己走过的格子(但可以走对方走过的格子).如果不能 ...
- 2019 ICPC南京网络赛 F题 Greedy Sequence(贪心+递推)
计蒜客题目链接:https://nanti.jisuanke.com/t/41303 题目:给你一个序列a,你可以从其中选取元素,构建n个串,每个串的长度为n,构造的si串要满足以下条件, 1. si ...
- HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4734 数位DP. 用dp[i][j][k] 表示第i位用j时f(x)=k的时候的个数,然后需要预处理下小 ...
- 2013 ACM/ICPC 成都网络赛解题报告
第三题:HDU 4730 We Love MOE Girls 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4730 水题~~~ #include < ...
- HDU 4731 Minimum palindrome 2013 ACM/ICPC 成都网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4731 题解:规律题,我们可以发现当m大于等于3时,abcabcabc……这个串的回文为1,并且字典数最小 ...
- hdu 4762 && 2013 ACM/ICPC 长春网络赛解题报告
这次的答案是猜出来的,如果做得话应该是应该是一个几何概型的数学题: 答案就是:n/(m^(n-1)); 具体的证明过程: 1.首先枚举这M个点中的的两个端点,概率是:n*(n-1); 2.假设这个蛋糕 ...
随机推荐
- note.js之 Nodejs+Express4在windows下的配置
本篇主要介绍一下在windows平台下采用nodejs+express4框架+Mongodb实现网站的开发.其实本人是不赞同在Windows平台下使用node.js进行开发,但由于公司后台工程师都是采 ...
- opencv笔记3:trackbar简单使用
time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...
- 基于SVD的推荐算法
首先每行减去每列的均值,然后svd分解,得到USV,然后US代表用户矩阵u,SV代表项目矩阵v,那么预测评分为用户均值加上uv. 降维方法扩展性好,不过降维导致信息损失,而且与数据及相关,高维情况下效 ...
- POJ1125 Stockbroker Grapevine
Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a me ...
- poj 3233 矩阵快速幂+YY
题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角 ...
- [NOIP2010] 提高组 洛谷P1514 引水入城
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- Tomcat 404
原因:servlet没有配置正确 ,查看web.xml确认正确,以及自己的请求路径正确 在IE中提示"404"错误有以下三种情况 1.未部署Web应用 2.URL输入错误 排错方法 ...
- spark-submit提示资源不足
ensure that workers are registered and have sufficient resources spark-cluster启动的配置里配置了每个worker的内存,如 ...
- 人工神经网络(ANN)
参考资料:http://www.cnblogs.com/subconscious/p/5058741.html 从函数上来看,神经网络是回归方程的级联叠加,用来逼近目标函数的,本质是一种模拟特征与目标 ...
- IPC 机制简介
IPC 机制简介 概述 在Unix早期发展中,做出重大贡献的两大主力Bell实验室和伯克利大学(BSD)在IPC(InterProcess Communication)方面的侧重点有所不同.前者对Un ...