题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524

思路:题目就是给你一个拓扑图,然后指定点的位置放棋子,然后两人轮流移动棋子(题目中的边的关系),直到一方不能移动。

SG函数裸题,之前接触的两道一个是推的关系,一个是取石子的。这个比较明显的就是出度为0的点,sg值为0。然后深搜得到其他点的sg值,棋子的异或和为0 则P必败,否则N必胜

由于递归写的很不好,导致没过。最开始竟然用队列随便写了一个。(TLE),后来尝试用dfs写了,WA,迫于无奈只好看题解了(果真就是dfs)  后面附有错误代码

AC代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define in freopen("in.txt", "r", stdin);
typedef long long ll;
const int inf = 0x3f3f3f3f;vector<int> G[1010];
int sg[1010];
int n, xi, u, v, m, x;
int dfs(int id) { //为什么感觉不是太难写,自己就是写不出来。   T_T !!!if(sg[id] != -1) return sg[id];//已经有了直接返回 bool vis[1010];//标记,求mex memset(vis, false, sizeof(vis));for(int i = 0; i < G[id].size(); i++) {sg[G[id][i]] = dfs(G[id][i]);//递归求出后继sg值 vis[sg[G[id][i]]]= true;//标记后继的sg值 }for(int i = 0; ; i++) {if(!vis[i]) {return sg[id] = i;//求自己的sg值 }}
}int main() {while(~scanf("%d", &n)) {memset(G, 0, sizeof(G));for(int i = 0; i < n; i++) {scanf("%d", &xi);while(xi--) {//存图 scanf("%d", &v);G[i].push_back(v);}}memset(sg, -1, sizeof(sg));while(scanf("%d", &m) && m) {int sum = 0;while(m--) {//异或和 scanf("%d", &x);sum ^= dfs(x);}if(sum)printf("WIN\n");elseprintf("LOSE\n");}}
}

瞎写的队列代码(TLE)

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define in freopen("in.txt", "r", stdin);
typedef long long ll;
const int inf = 0x3f3f3f3f;vector<int> G[1010];
int sg[1010];
int n, xi, u, v, m, x;void SG() {queue<int> q;for(int i = 0; i < n; i++) {if(G[i].size() == 0)sg[i] = 0;else q.push(i);//需要求的点i }bool vis[1010];while(!q.empty()) memset(vis, false, sizeof(vis));int u = q.front();bool flag = false;for(int j = 0; j < G[u].size(); j++) { if(sg[G[u][j]] != -1) {//如果后继有一个不知道的就换 vis[sg[G[u][j]]] = true;} else {flag = true;q.push(u);q.pop();}}if(flag == false) {//说明这个点的sg值可以求 for(int j = 0; j <= 1010; j++) {if(vis[j] == false) {sg[u] = j;break;}}q.pop();}}
}int main() {while(~scanf("%d", &n)) {memset(G, 0, sizeof(G));for(int i = 0; i < n; i++) {scanf("%d", &xi);if(xi == 0)continue;else {while(xi--) {scanf("%d", &v);G[i].push_back(v);}}}memset(sg, -1, sizeof(sg));SG();while(~scanf("%d", &m) && m) {int sum = 0;while(m--) {scanf("%d", &x);sum ^= sg[x];}if(sum)printf("WIN\n");elseprintf("LOSE\n");}}
}

自己写的错误DFS代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define in freopen("in.txt", "r", stdin);
typedef long long ll;
const int inf = 0x3f3f3f3f;vector<int> G[1010];
int sg[1010], indegree[1010];
int n, xi, u, v, m, x, topu;
vector<int> GB[1010];//该点的 后继值
void SG(int id) {for(int i = 0; i < G[id].size(); i++) {//我刚开始也写的bool vis[maxn]  但是我以为这个vis的状态会被破坏 T_T if(sg[G[id][i]] != -1)GB[id].push_back(sg[G[id][i]]);else {SG(G[id][i]);//瞎写我以为这样求下去,sg[G[id][i]]的值就有了 但是我还是感觉就有了。。。。 GB[id].push_back(sg[G[id][i]]);}}sg[id] = *min_element(GB[id].begin(), GB[id].end()) - 1;//直接求sg值
}int main() {while(~scanf("%d", &n)) {memset(G, 0, sizeof(G));memset(GB, 0, sizeof(GB));memset(indegree, 0, sizeof(indegree));for(int i = 0; i < n; i++) {scanf("%d", &xi);if(xi == 0)continue;else {while(xi--) {scanf("%d", &v);G[i].push_back(v);indegree[v]++;//因为是一个图,我就打算从根节点开始往下搜 }}}memset(sg, -1, sizeof(sg));for(int i = 0; i < n; i++) {if(G[i].size() == 0)sg[i] = 0;else if(indegree[i] == 0)topu = i;//根节点 }SG(topu);while(~scanf("%d", &m) && m) {int sum = 0;while(m--) {scanf("%d", &x);sum ^= sg[x];}if(sum)printf("WIN\n");elseprintf("LOSE\n");}}
}

转载于:https://www.cnblogs.com/ACMerszl/p/9572947.html

HDU1425 A Chess Game相关推荐

  1. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. hdu-5794 A Simple Chess(容斥+lucas+dp)

    题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  3. Codeforces 38B - Chess

    38B - Chess 思路:懂点象棋的规则就可以,看看哪些点可以放马. 代码: #include<bits/stdc++.h> using namespace std; #define ...

  4. BZOJ1801: [Ahoi2009]chess 中国象棋

    BZOJ1801: [Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...

  5. HDU 4832 Chess 排列组合 DP

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. Aeroplane chess HDU - 4405(期望dp)

    题意: 飞行棋.有n+1格,开始时在0号格子,每一步都要扔一个dice(六个面,概率相同)哪一面朝上他就会向前走x+i步.当x+i大于等于N的时候,游戏结束.另外,地图上有m条航线.第i条航线可以直接 ...

  7. Codeforces Round #732 (Div. 2) D. AquaMoon and Chess 组合数学 + 找规律

    传送门 文章目录 题意: 思路: 题意: 给你一个010101串,当且仅当某个111的某一边i+1,i−1i+1,i-1i+1,i−1有111,这个111可以跟i+2,i−2i+2,i-2i+2,i− ...

  8. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  9. HDU5794 - A Simple Chess

    HDU5794 - A Simple Chess 做法:首先的想法就是用总方案数减去,经过过障碍的方案数A.第一个思路就是容斥,但是显然不符合数据规模.另一个思路就是将障碍物从左上到右下排序,dp[i ...

最新文章

  1. C++入门经典-例6.14-通过指针连接两个字符数组
  2. Java通过JDBC连接SQL Server2017数据库
  3. 虚拟DOM和Diff算法 - 入门级
  4. 【最简单的例子】Editor.md的初步使用
  5. MSMQ 安装问题的解决过程
  6. 好朋友简简单单,好情谊清清爽爽,好缘份久久长长
  7. 孪生再世代表数字几_《孪生双鱼座》
  8. c语言对中文字符串编码_Python || 学习笔记(1):数据类型字符串变量和编码
  9. Struts2_1_基础案例_配置文件详解_动作类
  10. Java千百问_06数据结构(014)_java数组如何存储在内存中
  11. Android笔记 隐式意图vs显示意图+隐式意图打开短信应用demo
  12. C语言指针概念全面解析
  13. Windows 7/Windows Server 2008 R2中创建扩展分区
  14. 计算器单片机c语言代码,51单片机c语言计算器代码.doc
  15. 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码
  16. python标准库模块——json库的用法
  17. windows系统上安装.cab文件
  18. kappa一致性检验教程_一致性检验(kappa一致性分析)
  19. Android实现Twitter登录分享
  20. 干货丨让你更容易影响别人的 52 个小技巧

热门文章

  1. 阿里云混合云的政企上云新路径
  2. 实操指南 | Resource Queue如何实现对AnalyticDB PostgreSQL的资源管理?
  3. 如何跑通第一个 DataStream 作业?
  4. 10万人的大场馆如何“画座位”?
  5. 安全开发之碰撞检测与伤害计算逻辑
  6. 关于低分辨率像素游戏下显示非防锯齿中文 / 汉字的研究
  7. Linux操作系统知识
  8. RMAN备份及恢复归档日志的语法
  9. 微软给程序代码加的css效果
  10. intellij idea 显示打开文件路径按钮