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]将军相关推荐

  1. P3882 [JLOI2008]将军 (二分图)

    题目链接 前置知识 P2825 [HEOI2016/TJOI2016]游戏 注:本题做法与上题做法类似. 用到的算法: 图论--二分图--匈牙利算法(最大匹配) 建边--链式前向星. 解题思路 题目要 ...

  2. 【分布式共识三】拜占庭将军问题----书面协议

    2019独角兽企业重金招聘Python工程师标准>>> 区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤 来源:区块链兄弟 原文链接:http:// ...

  3. 什么是拜占庭将军问题

    接触区块链的同学,多少都听说过拜占庭将军问题,经常看到或听到某某区块链使用某某算法解决了拜占庭将军问题,那么究竟什么是拜占庭将军问题呢? 什么是拜占庭将军问题 也被称为"拜占庭容错" ...

  4. 大唐波斯将军 机器人_参观长沙博物馆“粟特人在大唐”文物展,感叹多元文明的交融互鉴...

    近日,笔者来到长沙博物馆,参观了在这里举办的"粟特人在大唐--洛阳博物馆藏唐代文物特展",十分感叹唐代多元文明之间的交融互鉴. 粟特人是中亚的古老民族,主要生活在今乌兹别克斯坦撒马 ...

  5. 拜占庭将军问题与中本聪

    拜占庭将军问题很多人可能听过,但不知道是什么意思,本文从非专业的角度来讲讲,拜占庭将军问题到底是说什么的. 拜占庭将军问题(Byzantine Generals Problem),首先由Leslie ...

  6. 【分布式共识二】拜占庭将军问题----口头协议

    拜占庭将军问题是一个共识问题: 首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure. ...

  7. 如何理解拜占庭将军问题?

    11位拜占庭将军去打仗, 他们各自有权力观测敌情并作出判断, 进攻或撤退, 那么怎么让他们只用传令兵达成一致呢? 一种很符合直觉的方法就是投票, 每位将军作出决定后都将结果"广播" ...

  8. 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释

    "拜占庭将军问题"维基百科: 拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文中提出的分布式对等网络通信容错问题.在分布式计算 ...

  9. 大唐波斯将军 机器人_你的工作会被机器人取代吗? 作者:大唐波斯将军2015-04-08 09:34...

    你的工作会被机器人取代吗? 作者:大唐波斯将军2015-04-08 09:34 标签: 90 分享 浏览原图 欢迎关注"创事记"的微信订阅号:sinachuangshiji 文/大 ...

最新文章

  1. 从火热到理性,2019年AI芯片行业发展的怎么样了?【附PPT下载】
  2. linux usb初始化
  3. 【完结】AI1000问以后知识星球和B站见啦
  4. JAVA引用和垃圾回收
  5. 组织配置java项目的外部lib包
  6. php返回一个变量,PHP从另一个文件获取变量
  7. 微信 小程序 canvas
  8. Centos 的安装(2)
  9. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)
  10. centos7搭建superset数据平台
  11. windox与ubuntu18.04安装clion及导入qt库
  12. 版本控制工具(GIT)
  13. MVC学习笔记----缓存
  14. Atitit.增强系统稳定性----虚拟内存的设置
  15. win7 下点击鼠标右键无法新建文件夹
  16. 《老路用得上的商学课》61-65学习笔记
  17. python绘制中文柱状图+显示数字
  18. 组合数的各种性质和定理
  19. 对于Verilog语言的一些总结
  20. 机器学习实战刻意练习 —— Task 02. 朴素贝叶斯

热门文章

  1. 八大古都大排名(权威版)
  2. linux服务器安全与配置,Linux系统服务器安装后的安全配置
  3. 关于盗墓笔记的那些事
  4. 解决Gitlab的The remote end hung up unexpectedly错误
  5. typeof和instanceof的区别
  6. 英语从句(英语兔学习笔记)
  7. Monte-Carlo算法(基本原理,理论基础,应用实践)
  8. Java在手机平台上的Porting
  9. java面试逻辑思维题目_逻辑思维面试题-java后端面试
  10. win10系统安装到服务器失败,win10安装失败怎么办?