小QQ是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个N \times NN×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:

行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)

列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)

游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。

对于某些关卡,小QQ百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!于是小QQ决定写一个程序来判断这些关卡是否有解。

         

       目标状态要求矩阵的主对角线上的格子均为黑色。

即是(1,1),(2,2),(3,3)......(n,n)皆匹配;

如果原图满足每行和每列都匹配,那么通过交换,一定可以换成上面这种情况。

所以拆行和列跑一个最大二分图匹配,并判断匹配数是否等于n即可。

代码见

#include<bits/stdc++.h>
#define re register int
#define maxn 200+5
using namespace std;
int t,n;
int ma[maxn][maxn];
inline int read(){
int x=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-;
ch=getchar();
}
while(isdigit(ch)){
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
}
int ans,match[maxn];
bool ed[maxn][maxn],vis[maxn];
bool dfs(int x){
for(re i=;i<=n;i++)
if(!vis[i]&&ed[x][i]){
vis[i]=true;
if(!match[i]||dfs(match[i]))
{
match[i]=x;
return true;
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
t=read();
while(t--)
{
ans=;
memset(match,,sizeof(match));
memset(ed,false,sizeof(ed));
n=read();
for(re i=;i<=n;i++)
for(re j=;j<=n;j++)
ed[i][j]=read();
for(re i=;i<=n;i++)
{
memset(vis,false,sizeof(vis));
ans+=dfs(i);
}
if(ans==n) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return ; }

[HEOI2016/TJOI2016]游戏

在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂。简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹。在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到。炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威力可以穿透软石头,但是不能穿透硬石头。给定一张n*m的网格地图:其中*代表空地,炸弹的威力可以穿透,可以在空地上放置一枚炸弹。x代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。#代表硬石头,炸弹的威力是不能穿透的,不能在此放置炸弹。例如:给出1*4的网格地图*xx*,这个地图上最多只能放置一个炸弹。给出另一个1*4的网格地图*x#*,这个地图最多能放置两个炸弹。现在小H任意给出一张n*m的网格地图,问你最多能放置多少炸弹。

       显然 这道题和上面的题极为相像。

需要处理的是把联通的序列(包括空地和软石头)行和列分别处理,进行二分图匹配。

#include<bits/stdc++.h>
#define re register int
#define maxn 50+5
#define maxn1 2500+5
using namespace std;
int n,m;
int cnt,tot;
char ma[maxn][maxn];
int row[maxn][maxn],col[maxn][maxn];
struct edge{
int nex,to;
}ed[maxn1];
int head[maxn1];
inline int read(){
int x=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-;
ch=getchar();
}
while(isdigit(ch)){
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
}
inline void write(int x){
if(x<){
putchar('-');
x=-x;
}
if(x>) write(x/);
putchar(x%+'');
}
int ans,match[maxn1];
bool vis[maxn1];
bool dfs(int x){
for(re e=head[x],v;e;e=ed[e].nex)
{
if(!vis[v=ed[e].to])
{
vis[v]=true;
if(!match[v]||dfs(match[v]))
{
match[v]=x;
return true;
}
}
}
return false;
}
void add(int x,int y) {
ed[++cnt].nex=head[x];
ed[cnt].to=y;
head[x]=cnt;
}
char get(){
char ch;
while((ch=getchar())!='#'&&ch!='*'&&ch!='x');
return ch;
}
int main()
{
ios::sync_with_stdio(false);
n=read();
m=read(); ;
for(re i=;i<=n;i++)
for(re j=;j<=m;j++)
ma[i][j]=get();
for(re i=;i<=n;i++)
for(re j=;j<=m;j++){
if(ma[i][j]=='#') continue;
if(j==||ma[i][j-]=='#') tot++;
row[i][j]=tot;
}
for(re i=;i<=m;i++)
for(re j=;j<=n;j++){
if(ma[j][i]=='#') continue;
if(j==||ma[j-][i]=='#') tot++;
col[j][i]=tot;
}
for(re i=;i<=n;i++)
for(re j=;j<=m;j++)
{
if(ma[i][j]!='*') continue;
add(row[i][j],col[i][j]);
}
for(re i=;i<=tot;i++)
{
memset(vis,false,sizeof(vis));
ans+=dfs(i);
}
write(ans);
return ; }

[ZJOI2007]矩阵游戏【bzoj1059/洛谷1129】/ [HEOI2016/TJOI2016]游戏的更多相关文章

  1. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  2. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  3. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

  4. 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告

    P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...

  5. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  6. 洛谷P4093 [HEOI2016/TJOI2016]序列

    题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...

  7. 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树

    正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...

  8. [洛谷P4091][HEOI2016/TJOI2016]求和

    题目大意:给你$n(n\leqslant10^5)$,求:$$\sum\limits_{i=0}^n\sum\limits_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix ...

  9. [洛谷P4092][HEOI2016/TJOI2016]树

    题目大意:给你一棵树,有两个操作: $C\;x:$给第$x$个节点打上标记 $Q\;x:$询问第$x$个节点的祖先中最近的打过标记的点(自己也是自己的祖先) 题解:树剖,可以维护区间或,然后若一段区间 ...

随机推荐

  1. 笨办法33while循环

    改了之前的代码,加入while: #coding: utf-8 print("王小狗丑不丑?丑→1:不丑→2") answer = input(">") ...

  2. VM虚拟机拍摄快照时出错或者克隆失败解决办法

    在换了固态硬盘后,下载好VM,装虚拟机,结果克隆虚拟机和拍摄快照时出问题了. 拍摄快照时出错或者隆失败出现参数错误如图: 所提供的参数中有一个无效参数 解决办法 出现这个问题一般是在机械硬盘的电脑上面 ...

  3. maven的依赖特性

    若排版紊乱可查看我的个人博客原文地址 maven的依赖特性很多很杂,这里大概总结一下,maven的依赖特性主要是依赖范围和传递依赖,前者会影响后者,这篇文章会介绍传递依赖的传递原则,出现冲突传递依赖默 ...

  4. Windows下使用service.bat安装tomcat服务, 启动停止tomcat服务

    在项目开发过程中,以前只是在Eclipse中配置.启动.停止tomcat服务器 如果只想在机器中使用tomcat服务器,而不想安装MyEclipse,可以使用service.bat 将tomcat安装 ...

  5. lunx中部分命令总结

    一.文件和目录操作命令ls  全拼list,功能是列出目录的内容及其内容属性信息. cd  全拼change directory,功能是从当前工作目录切换到指定的工作目录. cp  全拼copy,其功 ...

  6. python笔记25-sys模块

    import sys#sys.argv命令行参数List,第一个元素是程序本身路径# sys.exit('xxxxx')#退出程序,正常退出时exit(0)# print(sys.version) # ...

  7. 编译libcurl支持https协议

    编译与安装参考:http://www.cnblogs.com/openiris/p/3812443.html 注意事项:先下载安装完nasm和perl再打开控制台(需要将nasm安装路径添加到Path ...

  8. 非node环境下的vue.js 实现简单的购物车计算功能 样式请无视

    都说vue的双向数据绑定好用,自己用了下,感觉做购物车没想象中好用.自己的实现如下: <!DOCTYPE html> <html lang="en"> &l ...

  9. win10下运行cmd闪退时检查方法

    在cmd下运行 exe加空格加斜杠加问号

  10. jmeter之服务器性能监测

    性能测试时,我们的关注点有两部分 1 服务本身:并发 响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMeter的plugins插件可以实现对服务器资源使用情况 ...