17142. μ°κ΅¬μ 3
https://www.acmicpc.net/problem/17142
17142λ²: μ°κ΅¬μ 3
μΈμ²΄μ μΉλͺ μ μΈ λ°μ΄λ¬μ€λ₯Ό μ°κ΅¬νλ μ°κ΅¬μμ μΉμμ΄κ° μΉ¨μ νκ³ , λ°μ΄λ¬μ€λ₯Ό μ μΆνλ €κ³ νλ€. λ°μ΄λ¬μ€λ νμ± μνμ λΉνμ± μνκ° μλ€. κ°μ₯ μ²μμ λͺ¨λ λ°μ΄λ¬μ€λ λΉνμ± μνμ΄κ³
www.acmicpc.net
Point
1. μ°κ΅¬μ 2μ λ¬λ¦¬ λΉνμ±ν λ°μ΄λ¬μ€κ° μ‘΄μ¬.
2. νμ±ν λ°μ΄λ¬μ€κ° λΉνμ±ν λ°μ΄λ¬μ€κ° μλ μΉΈμΌλ‘ κ°λ©΄ λΉνμ±ν λ°μ΄λ¬μ€κ° νμ±ν λ°μ΄λ¬μ€λ‘ λ°λλ€.
3. νμ±ν λ°μ΄λ¬μ€λ₯Ό μ ννλ κ²½μ°μ μλ μ΅λ 10κ°μ€μμ 5κ° κ³ λ₯΄λ κ²½μ°λ‘ 10C5 = 252κ°μ§ κ²½μ°κ° μ‘΄μ¬νλ€.
4. μ΅λ 10C5μ λν΄ BFSλ₯Ό μ€ννλ©΄ O(252*50*50)=630,000 μΌλ‘ μκ° μμ ν΅κ³Ό κ°λ₯.
μ΄ ν μ€νΈμΌμ΄μ€μ κ²½μ° μ νν μ μλ 2μ κ²½μ°μ μλ μ΄ 4κ°μ€μ 2κ°μ΄λ€. λ°λΌμ μ΄ 4C2 = 6κ°μ§ κ²½μ°μ μκ° μ‘΄μ¬νλ€.
μ μΌμ΄μ€μ κ²½μ° λ κ°μ§ κ²½μ°κ° μ‘΄μ¬νλλ° λ λ²μ§Έ κ²½μ°λ₯Ό 보면 λ΅μ΄ 3μ΄λΌκ³ κΈ°λν μ μλλ°, λ΅μ 2μ΄λ€.
3μ΄ λ€μ΄κ° μΉΈμ λΉνμ±ν λ°μ΄λ¬μ€κ° μλ μΉΈμΌλ‘ μ΅λ μκ°μ κ³μ°ν λμλ λΉνμ±ν λ°μ΄λ¬μ€μΉΈμ μ΄ν΄λ³΄μ§ μμλ λλ€.
Why ? λ¬Έμ μμ λͺ¨λ λΉ μΉΈμ λ°μ΄λ¬μ€λ₯Ό νΌλ¨λ¦¬λ μ΅μ μκ°μ ꡬνλΌκ³ νκΈ° λλ¬Έμ λΉνμ±ν λ°μ΄λ¬μ€ μΉΈμ μ΄ν΄λ³΄μ§ μμλ λλ€.
ν κ°μ§ μΌμ΄μ€λ₯Ό λ μ΄ν΄λ³΄μ.
μ΄ μΌμ΄μ€μ κ²½μ°λ λ κ°μ§ κ²½μ°κ° μ‘΄μ¬νλ€
λΉνμ±ν λ°μ΄λ¬μ€μ νμ±ν λ°μ΄λ¬μ€κ° λΏκ³ λ λ€μλ μ΄λ»κ² μ§νμ ν΄μ£Όμ΄μΌ ν κΉ?
μ°κ΅¬μ 2 λ¬Έμ μ λ§μ°¬κ°μ§λ‘ BFSλ₯Ό μ§νν λμλ λΉνμ±ν λ°μ΄λ¬μ€κ° μλ μΉΈμ λΉ μΉΈμΌλ‘ μ·¨κΈν΄μ£Όκ³ ,
μ΅μ μκ°μ κ³μ°ν λμλ λΉνμ±ν λ°μ΄λ¬μ€κ° μλ μΉΈμ μ΄ν΄λ³΄μ§ μμΌλ©΄ λλ€.
μ°κ΅¬μ 2 λ¬Έμ μμ μ°¨μ΄μ μ λ¨μ§ λΉνμ±ν λ°μ΄λ¬μ€κ° μλ μΉΈμ μ΄ν΄λ³΄λμ§μ λν μ¬λΆ.
μμ€ μ½λλ₯Ό μ΄ν΄λ³΄μ.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>
#define FASTio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define endl '\n'
using namespace std;
vector<vector<int>> area(51,vector<int>(51));
vector<pair<int,int>> virus;
int n, m;
int ans=-1;
int dy[]={-1,1,0,0};
int dx[]={0,0,1,-1};
int blank;
int bfs(queue<pair<int,int>> &q,vector<vector<bool>> check, vector<vector<int>> visited, vector<vector<bool>> &awake,int ans)
{
int result=-1;
int cnt = 0;
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
q.pop();
}
}
if(blank==cnt)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(awake[i][j]==false)
result = max(result,visited[i][j]);
if(area[i][j]==0 && check[i][j]==false)
return -1;
}
}
}
return result;
}
int main()
{
FASTio;
cin >> n >> m;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin >> area[i][j];
if(area[i][j]==2)
{
virus.push_back({i,j});
}
else if(area[i][j]==0)
{
blank++;
}
}
}
// μ‘°ν© μ΄κΈ° μμ
vector<int> k(virus.size());
for(int i=0;i<m;i++)
{
k[i] = 1;
}
for(int i=m;i<virus.size();i++)
{
k[i] = 0;
}
sort(k.begin(),k.end());
// μ‘°ν©
do
{
queue<pair<int,int>> q;
vector<vector<int>> visited(51,vector<int>(51,0));
vector<vector<bool>> check(51,vector<bool>(51,false));
vector<vector<bool>> awake(51,vector<bool>(51,false));
for(int i=0;i<virus.size();i++)
{
if(k[i]==1)
{
int y,x;
tie(y,x) = virus[i];
q.push(make_pair(y,x));
check[y][x]=true;
awake[y][x]=true;
}
}
int a = bfs(q,check,visited,awake,ans);
if(a==-1) continue;
else
{
if(ans==-1 || ans>a)
{
ans = a;
}
}
} while (next_permutation(k.begin(),k.end()));
cout << ans;
return 0;
}
Main
1. λ°°μ΄ μ λ ₯ -> 2μΌ κ²½μ° μ‘°ν© μ νμ§μ ν¬ν¨μν€κΈ° μν΄ λ²‘ν° νΈμ¬, 0μΌ κ²½μ° λΉμΉΈμ κ°μ++
2. next_permutationμ μ΄μ©ν μ‘°ν©μ μ΄μ©νκΈ° μν μ΄κΈ°μμ
3. 2μ μ΄ κ°μ μ€μ mκ° μ ννλ κ° κ²½μ°μ λν BFS
BFS
1. νμ¬ νμλ νμ±ν λ λ°μ΄λ¬μ€ mκ°κ° λ€μ΄μλ μν©
2. μ°κ΅¬μ 2μ λ§μ°¬κ°μ§λ‘ νλ₯Ό νλ² λλ©΄μ BFSλ₯Ό μ§ννλ€.
3. BFSλ₯Ό μ§ννλ λμ€ mainν¨μμμ λΉμΉΈμ κ°μλ§νΌ λ€ μ±μ΄ κ²½μ° λ μ΄ν΄λ³Ό νμκ° μμΌλ―λ‘ BFSλ₯Ό μ’ λ£νλ€.
4. BFSλ₯Ό μ§ννλ λμ€ λΉνμ±ν λ°μ΄λ¬μ€λ₯Ό λ§λλ κ²½μ° νμ±ν μμΌμ€λ€.
5. κ·Έ μΈλ μ°κ΅¬μ 2μ λμΌνλ° BFSκ° μ’ λ£λκ³ λ°μ΄λ¬μ€κ° νΌμ§λλ° κ±Έλ¦° μκ°μ μ΄ν΄λ³Ό λμ λΉνμ±ν λ°μ΄λ¬μ€ μΉΈμ μ΄ν΄λ³΄μ§ μλλ€.
λΆλͺ μκ°λ³΅μ‘λλ₯Ό κ³μ°νμ λ ν΅κ³Όλ κ²μ΄λΌ μκ°νλλ° μκ³ λ³΄λ λ΄λΆμ λ‘μ§μ λ¬Έμ κ° μμλ€.
AC μ½λ (BFS)
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
q.pop();
}
}
μκ°μ΄κ³Ό μ½λ (BFS)
while(!q.empty())
{
if(blank==cnt)
{
break;
}
for(int i=0;i<q.size();i++)
{
int y = q.front().first;
int x = q.front().second;
for(int i=0;i<4;i++)
{
int ny = y+dy[i];
int nx = x+dx[i];
if(ny>=0 && nx>=0 && ny<n && nx<n)
{
if(check[ny][nx]==false && area[ny][nx]!=1)
{
if(area[ny][nx]==2 && awake[ny][nx]==false)
{
awake[ny][nx]=true;
}
if(area[ny][nx]==0) cnt++;
visited[ny][nx] = visited[y][x]+1;
check[ny][nx]=true;
q.push({ny,nx});
}
}
}
}
q.pop();
}
qλ₯Ό popνλ μμ μ΄ μνμ’μ°λ₯Ό μ΄νΌκ³ νΈμ¬λ₯Ό ν μ§ν λ°λ‘ νμ ν΄μ£Όμ΄μΌ νλλ° q sizeλ§νΌ forλ¬Έμ λλ¦°λ€μ λ€λ¦κ² νμ ν΄μ£Όμ΄μ μκ°μ΄κ³Όκ° λ°μνλ€. μ΄λ κ² μ¬μν΄λ³΄μ΄μ§λ§ μ€μν λ‘μ§μ λλ²κΉ νκΈ° μ΄λ €μ°λ ꡬνν λμ λμ± μ κ²½μ¨μΌκ² λ€.