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<=2001 #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