[JLOI2008]将军
Description
刘先生最近在学习国际象棋,使用一个叫”jloi-08”的游戏软件。在这个游戏里,不但可以和电脑普通地对弈,还可以学习著名的棋局,还有针对初学者的规则指导等丰富功能。但是…大小却要1.4G T_T。
言归正传,在这个软件里,为了让玩家更好地理解和运用各个棋子,有很多趣味的游戏,比如以下就是一个:
给出一个棋盘和一些棋子,让你把这些棋子摆放在棋盘上,使得两两不互相攻击。你的得分由你摆放上去的棋子的个数与种类有关。
这个游戏很复杂,刘先生老是玩不到高分。于是电脑便降低了难度,替刘先生摆上了一些棋子,最后只给你任意多个bishop(教主)。
现在刘先生便要考一考你,在电脑给出的这张棋盘上,最多能放几个bishop。
国际象棋中一共有6种棋子:
king (国王)
queen (皇后)
bishop (教主)
knight (骑士)
rook (车)
pawn (步兵)
queen和knight不用说了;rook攻击水平和垂直两条线上的所有格子;pawn攻击前方两条斜线方向各一格;king攻击周围8个方向各1格;bishop攻击两条对角线上的所有格子。
除knight以外,所有棋子的攻击范围均会被别的棋子所阻挡。(“前方”指x递增的方向,x行y列)
可惜的是这个软件也不是顶优秀,给出的棋盘上的棋子可能互相会攻击,不过你不用理会这些,你只要保证你摆放的bishop不与它们以及不互相攻击就可以了。
Input
第一行是2个整数x, y(1<=x,y<=1024),
下面的x行每行y个字符表示棋盘,
其中:K – king, Q – queen, B – bishop, N – knight, R – rook, P – pawn, “.” – blank.
Output
仅一行一个数,表示最多能够摆放的bishop的个数。
Sample Input
3 3
..N
...
...
Sample Output
2
恶心的大模拟……还好玩过国际象棋
预处理出原本的棋子能攻击的所有的点,然后由于bishop的攻击的斜线攻击,于是我们将棋盘旋转45°,再横竖划分,连边跑最大匹配即可
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){int x=0,f=1; char ch=gc();for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';return x*f;
}
inline int read(){int x=0,f=1; char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';return x*f;
}
inline void print(int x){if (x<0) putchar('-'),x=-x;if (x>9) print(x/10);putchar(x%10+'0');
}
const int N=1<<10,M=1<<20;
bool l[(N<<1)+10],r[(N<<1)+10];//l:\ r:/
bool can[N+10][N+10];
char map[N+10][N+10];
int pre[M+10],now[(N<<1)+10],child[M+10];
int path[(N<<1)+10],vis[(N<<1)+10];
int tot,Time,n,m,Ans;
bool in_map(int x,int y){return x>0&&x<=n&&y>0&&y<=m;}
void join(int x,int y){pre[++tot]=now[x],now[x]=tot,child[tot]=y;}
bool Extra(int x){for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){if (vis[son]==Time) continue;vis[son]=Time;if (!~path[son]||Extra(path[son])){path[son]=x;return 1;}}return 0;
}
void solve_King(int x,int y){for (int i=-1;i<=1;i++){for (int j=-1;j<=1;j++){int tx=x+i,ty=y+j;if (!in_map(tx,ty)) continue;can[tx][ty]=1;}}
}
void solve_Pawn(int x,int y){for (int i=-1;i<=1;i++){for (int j=-1;j<=1;j++){if (!i||!j) continue;int tx=x+i,ty=y+j;if (!in_map(tx,ty)) continue;can[tx][ty]=1;}}
}
void solve_Rook(int x,int y){for (int i=x-1;i>=1;i--){if (map[i][y]!='.') break;can[i][y]=1;}for (int i=x+1;i<=n;i++){if (map[i][y]!='.') break;can[i][y]=1;}for (int j=y-1;j>=1;j--){if (map[x][j]!='.') break;can[x][j]=1;}for (int j=y+1;j<=n;j++){if (map[x][j]!='.') break;can[x][j]=1;}
}
void solve_Queen(int x,int y){solve_Rook(x,y);}
const int dx[8]={-2,-2,-1,-1,1,1,2,2};
const int dy[8]={-1,1,-2,2,-2,2,-1,1};
void solve_Knight(int x,int y){for (int k=0;k<8;k++){int tx=x+dx[k],ty=y+dy[k];if (!in_map(tx,ty)) continue;can[tx][ty]=1;}
}
int main(){memset(path,255,sizeof(path));n=read(),m=read();for (int i=1;i<=n;i++){scanf("%s",map[i]+1);for (int j=1;j<=m;j++)if (map[i][j]!='.')l[i-j+m]=1,r[i+j-1]=1;}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){if (map[i][j]=='K') solve_King(i,j);if (map[i][j]=='P') solve_Pawn(i,j);if (map[i][j]=='R') solve_Rook(i,j);if (map[i][j]=='Q') solve_Queen(i,j);
// if (map[i][j]=='B') solve_Bishop(i,j);if (map[i][j]=='N') solve_Knight(i,j);}}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){if (can[i][j]|l[i-j+m]||r[i+j-1]) continue;join(i-j+m,i+j-1);}}for (int i=1;i<n+m;i++){++Time;if (Extra(i)) Ans++;}printf("%d\n",Ans);return 0;
}
转载于:https://www.cnblogs.com/Wolfycz/p/10252441.html
[JLOI2008]将军相关推荐
- P3882 [JLOI2008]将军 (二分图)
题目链接 前置知识 P2825 [HEOI2016/TJOI2016]游戏 注:本题做法与上题做法类似. 用到的算法: 图论--二分图--匈牙利算法(最大匹配) 建边--链式前向星. 解题思路 题目要 ...
- 【分布式共识三】拜占庭将军问题----书面协议
2019独角兽企业重金招聘Python工程师标准>>> 区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤 来源:区块链兄弟 原文链接:http:// ...
- 什么是拜占庭将军问题
接触区块链的同学,多少都听说过拜占庭将军问题,经常看到或听到某某区块链使用某某算法解决了拜占庭将军问题,那么究竟什么是拜占庭将军问题呢? 什么是拜占庭将军问题 也被称为"拜占庭容错" ...
- 大唐波斯将军 机器人_参观长沙博物馆“粟特人在大唐”文物展,感叹多元文明的交融互鉴...
近日,笔者来到长沙博物馆,参观了在这里举办的"粟特人在大唐--洛阳博物馆藏唐代文物特展",十分感叹唐代多元文明之间的交融互鉴. 粟特人是中亚的古老民族,主要生活在今乌兹别克斯坦撒马 ...
- 拜占庭将军问题与中本聪
拜占庭将军问题很多人可能听过,但不知道是什么意思,本文从非专业的角度来讲讲,拜占庭将军问题到底是说什么的. 拜占庭将军问题(Byzantine Generals Problem),首先由Leslie ...
- 【分布式共识二】拜占庭将军问题----口头协议
拜占庭将军问题是一个共识问题: 首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure. ...
- 如何理解拜占庭将军问题?
11位拜占庭将军去打仗, 他们各自有权力观测敌情并作出判断, 进攻或撤退, 那么怎么让他们只用传令兵达成一致呢? 一种很符合直觉的方法就是投票, 每位将军作出决定后都将结果"广播" ...
- 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释
"拜占庭将军问题"维基百科: 拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文中提出的分布式对等网络通信容错问题.在分布式计算 ...
- 大唐波斯将军 机器人_你的工作会被机器人取代吗?
作者:大唐波斯将军2015-04-08 09:34...
你的工作会被机器人取代吗? 作者:大唐波斯将军2015-04-08 09:34 标签: 90 分享 浏览原图 欢迎关注"创事记"的微信订阅号:sinachuangshiji 文/大 ...
最新文章
- 从火热到理性,2019年AI芯片行业发展的怎么样了?【附PPT下载】
- linux usb初始化
- 【完结】AI1000问以后知识星球和B站见啦
- JAVA引用和垃圾回收
- 组织配置java项目的外部lib包
- php返回一个变量,PHP从另一个文件获取变量
- 微信 小程序 canvas
- Centos 的安装(2)
- 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)
- centos7搭建superset数据平台
- windox与ubuntu18.04安装clion及导入qt库
- 版本控制工具(GIT)
- MVC学习笔记----缓存
- Atitit.增强系统稳定性----虚拟内存的设置
- win7 下点击鼠标右键无法新建文件夹
- 《老路用得上的商学课》61-65学习笔记
- python绘制中文柱状图+显示数字
- 组合数的各种性质和定理
- 对于Verilog语言的一些总结
- 机器学习实战刻意练习 —— Task 02. 朴素贝叶斯