题目:

给定一个01 矩阵,其中你可以在0的位置放置攻击装置。每一个攻击装置 (x,y) 都可以按照“日”字攻击其周围八个位置(x−1,y−2),(x−2,y−1),(x+1,y−2),(x+2,y−1),(x−1,y+2), (x−2,y+1),(x+1,y+2),(x+2,y+1)。

求在装置不相互攻击的情况下,最多可以放置多少个装置。

输入

第一行一个整数 N,表示矩阵大小为 N*N。接下来 N 行是一个长度为N的01 串,表示矩阵。(N <= 200)

输出

一个整数,表示在装置不相互攻击的情况下最多可以放置多少个装置。

样例输入

3
010
000
100

样例输出

4

分析:通过画图来分析,假设在左上角放置攻击装置,忽略障碍,标记出可以其他可以放置跟不可以放置装置的位置,会发现他们是交替出现的;如果把x和y坐标和为奇数的位置归为一类,为偶数的归为一类,则在同类位置间任意放置装置时不会相互攻击,在两类位置分别放置攻击装置时,可能相互攻击。至此,此题二分图的特征已经相当明显了,是个求解最大独立集的问题。
代码如下(通过此题发现vector存图好慢,跟手写的结构体相比,差了不止一点,以后还是尽量少用vector存图):
#include <cstdio>
#include <cstring>
using namespace std;
#define N 205 //发现用vector 存图好慢呀
struct Edge{
int v, next;
}edge[N*N*];
int Ecnt;
int head[N*N]; char mp[N][N];
int id[N][N];
int n;
int go[][] = {{-,}, {-,}, {,}, {,}}; int link[N*N];
bool visited[N*N]; void add(int u, int v)
{
edge[Ecnt].v = v, edge[Ecnt].next = head[u], head[u] = Ecnt++;
edge[Ecnt].v = u, edge[Ecnt].next = head[v], head[v] = Ecnt++;
} bool find(int u)
{
for(int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if(visited[v]) continue;
visited[v] = true;
if(link[v] == - || find(link[v]))
{
link[v] = u;
return true;
}
}
return false;
} int solve()
{
int m = (n*n+)>>, c = n*n;
memset(link, -, sizeof(link));
int res = ;
for(int i = ; i < m; i++)
{
memset(visited, , sizeof(visited));
if(find(i)) res++;
}
return res;
} int main()
{
while(~scanf("%d", &n))
{
int m = (n*n+)/;
memset(head, -, sizeof(head));
Ecnt = ;
for(int i = ; i < n; i++) scanf("%s", mp[i]);
int cnt = ;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
cnt += (mp[i][j] == '');
int c0 = , c1 = (n*n+)>>;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
id[i][j] = ((i+j)&) ? c1++ : c0++;
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
{
if(mp[i][j] == '')
{
int nx, ny;
for(int k = ; k < ; k++)
{
nx = i+go[k][], ny = j+go[k][];
if(nx >= && nx < n && ny >= && ny < n && mp[nx][ny] == '')
add(id[i][j], id[nx][ny]);
}
}
}
}
printf("%d\n", n*n-cnt-solve());
}
return ;
}
 

toj 4061 矩阵攻击(最大独立集)的更多相关文章

  1. [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)

    Problem 1686 神龙的难题 Accept: 444    Submit: 1365 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pro ...

  2. BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...

  3. 【最大独立集】BZOJ3175- [Tjoi2013]攻击装置

    [题目大意] 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2, ...

  4. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  5. P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图

    展开 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可 ...

  6. 【刷题】BZOJ 3175 [Tjoi2013]攻击装置

    Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1), ...

  7. BZOJ 3175: [Tjoi2013]攻击装置

    捉水题真是捉上瘾了TUT Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y- ...

  8. BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配

    BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置 ...

  9. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

随机推荐

  1. springboot版本依赖

    springboot2.x及以后依赖于jdk1.8及以上. 如图:

  2. HTML中<input>和<textarea>的区别

    在HTML中有两种方式表达文本框 一个是<input>元素的单行文本框 一种是<textarea>的多行文本框. <input>元素: 1.一定要指定type的值为 ...

  3. 使dialog可拖拽指令

    在项目开发过程中,需要支持dialog弹窗可拖拽,则需要对dialog添加指令.具体操作说明如下: (1)在用于存放指令的文件夹内,新建拖拽指令文件夹,例如命名为:el-dragDialog,如下所示 ...

  4. vue项目运行时出现的问题(less、vue poackages version)

    今天运行项目,项目一直好好的却突然运行时报错,如下: 是引入文件报错问题,回头查看了一下文件在main.js的引入: import '@/assets/styles/custom.less'; 文件引 ...

  5. upc组队赛18 THE WORLD【时间模拟】

    THE WORLD 题目链接 题目描述 The World can indicate world travel, particularly on a large scale. You mau be l ...

  6. 关于eclipse中的maven插件问题

    最近上课讲eclipse 中的maven插件 有一个坑确实比较坑,实际上就是一个配置的原因. 就是在eclipse中设置java 的buildpath的时候,一般不注意往往都设置成了jre的,这样的话 ...

  7. onblur和onkeyup事件

    onblur:事件会在对象失去焦点时发生 提示:onblur 相反事件为onfocus事件 . onkeyup: 事件会在键盘按键被松开时发生. 提示:与onkeyup 事件相关的事件发生次序: on ...

  8. vuex基本使用

    1.组件之间共享数据的方式 父向子传值:v-bind 属性绑定 子向父传值:v-on 事件绑定 兄弟组件之间共享数据:EventBus $on 接收数据的那个组件 $emit 发送数据的那个组件 2. ...

  9. python selenium无法清除文本框内容问题

    正常是我们在清除文本框内容的时候,都会使用 clear() 函数进行清除,但是有时候会出现,清除完成后再点击查询时,文本框的内容会再次自动填充,这个时候我们可以选择以下方式: #清空查询条件drive ...

  10. Spring Security 02

    权限管理 配置不过滤的资源 方法1 <http pattern="/login.jsp" security="none"></http> ...