模拟战役
刚刚开始我对题目的理解有问题,我认为的3x3是这样子的
后来发现是这样的
我的语文老师一定会哭死的 QAQ
思路:
遇到的每个没有进入联通通块的炮做一遍BFS或是DFS找到包含它的连通块,并统计该连通块内的炮的数量。
模拟战争题解
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define INF 0x3f3f3f3f
#define PII pair<int, int>
#define rep(i, l, r) for (int i = l; i < r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define rep2(i, l, r) for (int i = l; i * i <= r; i++)
#define rep3(i, l, r) for (LL i = l; i * i * i <= r; i++)
#define Min(a, b) a > b ? b : a
#define Max(a, b) a > b ? a : b
#define endl '\n'
#define debug "-----"
using namespace std;
typedef long long LL;
const LL mod = 1e9;
const int N = 1e6 + 10, M = 1010;
LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }
int m,n;
char qiqi[M][M];
char siji[M][M];
bool st[M][M];
int k;
void dfs( int x , int y , char mp[][1010] ){
++k;
rep( i , x-1 , x+2 )
rep( j , y-1 , y+2 ){
if( i == x && j == y ) continue;
if( i < 1 || i > 4 ) continue;
if( j < 1 || j > m ) continue;
if( st[i][j] ) continue;
if( mp[i][j] == '.' ) continue;
st[i][j] = 1;
dfs( i , j , mp );
}
}
vector<int> solve( char mp[][1010] ){
vector<int>ans;
memset( st , 0 , sizeof st );
rep( i , 1 , 5 )
rep( j , 1 , m+1 )
if( mp[i][j] == '*' && !st[i][j] ){
k = 0; //一个连通块中炮台数量
st[i][j] = 1;
dfs( i , j , mp );
ans.push_back( k );
}
return ans;
}
int main()
{
IOS;
cin >> m;
rep( i , 1 , 5 )
rep( j , 1 , m+1 )
cin >> siji[i][j];
rep(i, 1, 5)
rep(j, 1, m + 1)
cin >> qiqi[i][j];
vector<int>qv = solve( qiqi );
vector<int>sv = solve( siji );
sort( qv.begin() , qv.end() );
LL ans = 0;
// cout << qv.size() << ' ' << sv.size() << endl;
if( sv.size() > qv.size() )
cout << -1;
else{
rep( i , 0 , qv.size() )
ans += qv[i];
rep( i , 0 , sv.size()-1 ) ans -= qv[i];
cout << ans;
}
return 0;
}