[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;
}
[JLOI2008]将军的更多相关文章
- [ACM_动态规划] Alignment (将军排队)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/F 题目大意:有n个士兵排成一列,将军想从中抽出最少人数使队伍中 ...
- 别做操之过急的”无效将军”,做实实在在的”日拱一卒” zz
别做操之过急的”无效将军”,做实实在在的”日拱一卒” 前天在网上看到一句话很不错,拿来和大家分享,同时用我的“大叔”三观来解读这句话. 这句话是:“我们不需要操之过急的”无效将军”,我们需要实实在在的 ...
- [Swust OJ 767]--将军回家(Dijkstra算法)
题目链接:http://acm.swust.edu.cn/problem/767/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- [区块链] 拜占庭将军问题 [BFT]
背景: 拜占庭将军问题很多人可能听过,但不知道具体是什么意思.那么究竟什么是拜占庭将军问题呢? 本文从最通俗的故事讲起,并对该问题进行抽象,并告诉大家拜占庭将军问题为什么在区块链领域作为一个重点研究问 ...
- 香港,将军澳,TKO,服务器,运维,机房,云清洗
目前香港到大陆速度最快.最稳定线路之一. 线路也是唯一华南华北一样快速的线路,是100%的“双线”,不存在其他香港线路网通访问比电信慢的问题. (香港)将军澳TKO机房网络速度快捷,机房内部环境配有意 ...
- 两将军问题、拜占庭将军问题、TCP三路握手过程的联系
2015年初时产生了一个疑问:基于不可靠的通信链路,为什么在两将军问题中永远无法达到共识,而在TCP三路握手中可以? 今天抽出了一些时间进行研究发现,实际上TCP三路握手也不是完全可靠的,只是一个近似 ...
- 一致性hash理解、拜占庭将军问题解读和CAP理论总结
一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...
- (转)从拜占庭将军问题谈谈为什么pow是目前最好的共识机制
我们知道基于区块链技术现在有很多的共识机制,包括不限于POW,POS,DPOS,PBFT……,我先不说为什么我最认可POW,我们先来看看著名的拜占庭将军问题: 拜占庭帝国即中世纪的土耳其,拥有巨大的财 ...
- 拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事
拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事 背景:拜占庭帝国派出10支军队,去包围进攻一个强大的敌人,至少6支军队同时进攻才能攻下敌国. 难 ...
随机推荐
- Seesion和Cookie详解2
转载来自: https://www.toutiao.com/a6693986851193094664/?tt_from=weixin&utm_campaign=client_share& ...
- cocos2d-x(vs2012)环境搭建(第一篇)[版本号:cocos2d-x-3.1.1]
1.下载资源 下载cocos2d-x包V3.1.1,下载戳这里: http://www.cocos2d-x.org/download vs2012下载戳这里: http://www.xiazaiba. ...
- dubbo配置指南
dubbo配置指南 SLA配置在此完成!Service Layer Agreement ApplicationConfig 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者. Regist ...
- bash shell中的特殊用法
1 ${BASH_SOURCE-$0} 表示当前正在执行的脚本的完整路径. 2 cd -P 以物理路径进入 /usr/localhadoop现在链到/home/houzhizhen/usr/local ...
- LWIP在STM32上的移植
本文做记录摘抄,加上自己的体会: 文章标题:STM32使用LWIP实现DHCP客户端 http://www.cnblogs.com/dengxiaojun/p/4379545.html 该文章介绍了几 ...
- POJ3579 Median —— 二分
题目链接:http://poj.org/problem?id=3579 Median Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- jQuery制作信息提示弹出层插件【推荐】
给大家分享一款非常实用的弹窗提示窗口插件,包含多种模式.带有回执函数值的功能.1. [代码][JavaScript]代码 <script type="text/javascript& ...
- html5--6-24 css3前缀
html5--6-24 css3前缀 学习要点 掌握css3前缀的使用 CSS3目前很多新增属性尚未被W3C列为标准,对这些暂时未被公布为标准的属性,各家浏览器会在属性前加上前缀词,也将其称之为浏览器 ...
- hdu 4544 湫湫系列故事——消灭兔子(优先队列)
题意:n只兔子(有血量),m只箭(有伤害.花费),每只兔子只能被射一次,求射死所有兔子的最少花费. 思路:贪心,2重循环,兔子从血量高到低,箭从伤害高到低,用能射死兔子的箭中花费最小的箭射. #inc ...
- servlet的<url-pattern>
① 完全匹配 <url-pattern>/test/list.do</url-pattern> ② 路径匹配 <url-pattern>/*</url-pat ...