其他分享
首页 > 其他分享> > P4304 [TJOI2013]攻击装置

P4304 [TJOI2013]攻击装置

作者:互联网

[TJOI2013]攻击装置

题目描述

给定一个01矩阵,其中你可以在0的位置放置攻击装置。 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(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串,表示矩阵。

输出格式

 

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

输入输出样例

输入样例 #1

3
010
000
100

输出样例 #1

4

说明

30%数据N<=50 100%数据 N<=200    
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 
 6 using namespace std;
 7 const int N = 500;
 8 int g[N][N];
 9 
10 #define PII pair <int , int>
11 
12 int n;
13 int vis[N][N], now;
14 PII match[N][N];
15 int dx[8] = {1, 1, -1, -1, 2, 2 ,-2, -2};
16 int dy[8] = {2, -2, 2, -2, 1 ,-1, 1 ,-1};
17 
18 bool find(int x,int y)
19 {
20     for(int i = 0 ;i < 8 ;i++)
21     {
22         int a = x + dx[i], b = y + dy[i];
23         if(a >= 1 && a <= n && b >= 1 && b <= n)
24         {
25             if(!g[a][b])
26             {
27                 if(vis[a][b] != now)
28                 {
29                     vis[a][b] = now;
30                     if(match[a][b].first == 0 || find(match[a][b].first, match[a][b].second))
31                     {
32                         match[a][b] = make_pair(x, y);
33                         return 1;
34                     }
35                 }
36             }
37         }
38     }
39     return 0;
40 }
41 int main()
42 {
43     //freopen("4304.in", "r", stdin);
44     scanf("%d",&n);
45     int cnt = 0;
46     for(int i = 1; i <= n; i++)
47     {
48         for(int j = 1; j <= n; j++)
49         {
50             char c;
51             c = getchar();
52             while(c != '0' && c != '1') c = getchar();
53             if(c == '1')
54             {
55                 cnt++;
56                 g[i][j] = 1;
57             }
58         }
59     }
60 
61     // for(int i = 1; i <= n; i++)
62     // {
63     //     for(int j = 1 ;j <= n; j++)
64     //     {
65     //         printf("%d",g[i][j]);
66     //     }
67     //     printf("\n");
68     // }
69     // printf("\n");
70     int res = 0;
71     for(int i = 1; i <= n; i++)
72     {
73         for(int j = 1; j <= n; j++)
74         {
75             if(g[i][j] || (i + j)  % 2) continue;
76             now++;
77             if(find(i, j)) res++;
78         }
79     }
80     printf("%d",n * n - cnt - res);
81     return 0;
82 }

 

标签:装置,int,矩阵,样例,TJOI2013,攻击,P4304,include
来源: https://www.cnblogs.com/lyc-lb-blogs/p/14992604.html