BOJ 1799. ๋น์
๐โโ๏ธ[Gold I] ๋น์ - 1799
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2020 KB, ์๊ฐ: 44 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน
์ ์ถ ์ผ์
2024๋ 2์ 24์ผ 19:41:50
๋ฌธ์ ์ค๋ช
์์ ์ฅ๊ธฐ์ธ ์ฒด์ค์๋ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์์ง์ผ ์ ์๋ ๋น์(bishop)์ด ์๋ค. < ๊ทธ๋ฆผ 1 >๊ณผ ๊ฐ์ ์ ์ฌ๊ฐํ ์ฒด์คํ ์์ B๋ผ๊ณ ํ์๋ ๊ณณ์ ๋น์์ด ์์ ๋ ๋น์์ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์์ง์ฌ O๋ก ํ์๋ ์นธ์ ์๋ ๋ค๋ฅธ ๋ง์ ์ก์ ์ ์๋ค.
< ๊ทธ๋ฆผ 1 >
๊ทธ๋ฐ๋ฐ ์ฒด์คํ ์์๋ ๋น์์ด ๋์ผ ์ ์๋ ๊ณณ์ด ์๋ค. < ๊ทธ๋ฆผ 2 >์์ ์ฒด์คํ์ ์์น ๋ ๋ถ๋ถ์ ๋น์์ด ๋์ผ ์ ์๋ค๊ณ ํ์. ์ด์ ๊ฐ์ ์ฒด์คํ์ ์๋ก๊ฐ ์๋ก๋ฅผ ์ก์ ์ ์๋๋ก ํ๋ฉด์ ๋น์์ ๋๋๋ค๋ฉด < ๊ทธ๋ฆผ 3 >๊ณผ ๊ฐ์ด ์ต๋ 7๊ฐ์ ๋น์์ ๋์ ์ ์๋ค. ์์น ๋ ๋ถ๋ถ์๋ ๋น์์ด ๋์ผ ์ ์์ง๋ง ์ง๋๊ฐ ์๋ ์๋ค.
< ๊ทธ๋ฆผ 2 >
< ๊ทธ๋ฆผ 3 >
์ ์ฌ๊ฐํ ์ฒด์คํ์ ํ ๋ณ์ ๋์ธ ์นธ์ ๊ฐ์๋ฅผ ์ฒด์คํ์ ํฌ๊ธฐ๋ผ๊ณ ํ๋ค. ์ฒด์คํ์ ํฌ๊ธฐ์ ์ฒด์คํ ๊ฐ ์นธ์ ๋น์์ ๋์ ์ ์๋์ง ์๋์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋, ์๋ก๊ฐ ์๋ก๋ฅผ ์ก์ ์ ์๋ ์์น์ ๋์ ์ ์๋ ๋น์์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฒด์คํ์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง๋ค. ์ฒด์คํ์ ํฌ๊ธฐ๋ 10์ดํ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ ์๋์ ์์ ๊ฐ์ด ์ฒด์คํ์ ๊ฐ ์นธ์ ๋น์์ ๋์ ์ ์๋์ง ์๋์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฒด์คํ ํ ์ค ๋จ์๋ก ํ ์ค์ฉ ์ฃผ์ด์ง๋ค. ๋น์์ ๋์ ์ ์๋ ๊ณณ์๋ 1, ๋น์์ ๋์ ์ ์๋ ๊ณณ์๋ 0์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฃผ์ด์ง ์ฒด์คํ ์์ ๋์ ์ ์๋ ๋น์์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์๊ฐ ์ด๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค.
๋ด๊ฐ ํด๊ฒฐํ๋ คํ ๋ฐฉ๋ฒ์ ๋น์์ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๊ณ ํด๋น ๊ฒฝ์ฐ๊ฐ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ถํฉํ๋์ง ํ๋ณํ๊ณ ์ต๋ ๋น์ ๊ฐ์๋ฅผ ์ธ๋ ค๊ณ ํ๋ค.
DFS๋ฅผ ๋ ๊ฐ ๋ง๋ค์ด์ ๊ฐ๊ฐ ์๋ํด๋ดค๋๋ฐ ๋ ๋ค ์๊ฐ์ด๊ณผ๊ฐ ๋์ ํด๊ฒฐํ์ง ๋ชปํ๋ค.
๋ด๊ฐ ์ฒ์์ ์๊ฐํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
// 100๊ฐ์ ์นธ์ด ์ต๋ ๊ฐ
// ์๊ฐ ๋ณต์ก๋๋ฅผ ์๊ฐํด๋ณด์.
// ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ ๊ฒ์ด๋ค.
// ํ ์์น์ ๋น์์ ๋๊ฑฐ๋ ์๋๊ฑฐ๋์ด๋๊น
// ์นธ๋น 2๊ฐ์ ๊ฒฝ์ฐ์ ์
// ์ต๋ 2^100์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์จ๋ค -> ์ด๋ ๊ฒ ํ์ํ๋ฉด ์๊ฐ๋ด์ ๋ชปํผ๋ค
void setting();
bool isOkay(pair<int, int> p);
void DFS(int L);
void printBoard();
void solve();
int n, cache[100], res = 0, cnt = 0;
vector<vector<int>> board;
vector<pair<int, int>> goodPos;
int dy[] = { 1, 1, -1, -1 }; // ์ข์ธก ํ๋จ, ์ฐ์ธก ํ๋จ, ์ฐ์ธก ์๋จ, ์ข์ธก ์๋จ.
int dx[] = { -1, 1, 1, -1 };
void setting()
{
cin >> n;
board = vector<vector<int>>(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> board[i][j];
if (board[i][j] == 1) // ๋์ ์ ์๋ ๋น์ ์๋ฆฌ๋ค.
goodPos.push_back({ i, j });
}
}
}
// p์์น์ ๋น์์ ๋์์ ๋ ๊ด์ฐฎ์์ง ํ์ธํ๋ ํจ์.
bool isOkay(pair<int, int> p)
{
int y = p.first;
int x = p.second;
if (board[y][x] == 1)
return true;
for (int i = 0; i < 4; ++i)
{
while (true)
{
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > n)
break;
// ๋ค๋ฅธ ๋น์์ด ์์ ๊ฒฝ์ฐ ์๋ชป๋ ์์น.
if (board[ny][nx] == 2)
{
return false;
}
y = ny;
x = nx;
}
y = p.first;
x = p.second;
}
return true;
}
void DFS(int L)
{
if (L == goodPos.size())
{
bool flag = true;
for (int i = 0; i < goodPos.size(); ++i)
{
if (isOkay({ goodPos[i].first, goodPos[i].second }) == false)
{
flag = false;
break;
}
}
if (flag == true)
{
cnt = 0;
for (int i = 0; i < goodPos.size(); ++i)
{
if (board[goodPos[i].first][goodPos[i].second] == 2)
cnt++;
}
res = max(res, cnt);
}
}
else
{
board[goodPos[L].first][goodPos[L].second] = 1;
cache[L] = 1;
DFS(L + 1);
board[goodPos[L].first][goodPos[L].second] = 2;
cache[L] = 2;
DFS(L + 1);
}
}
void printBoard()
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void bishop(int L)
{
//printBoard();
if (L == goodPos.size())
{
cnt = 0;
for (int i = 0; i < goodPos.size(); ++i)
{
if (board[goodPos[i].first][goodPos[i].second] == 2)
cnt++;
}
res = max(res, cnt);
return;
}
else
{
board[goodPos[L].first][goodPos[L].second] = 2; // ์ด ์์น์ ๋น์ ๋๊ธฐ
if (isOkay(goodPos[L]))
bishop(L + 1);
board[goodPos[L].first][goodPos[L].second] = 1; // ์๋ณต
bishop(L + 1);
}
}
void solve()
{
setting();
//DFS(0);
bishop(0);
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}
์ฐธ ์ ํผ๊ฑฐ๊ฐ์๋ฐ ์์ฝ.
๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ๋ณด๋๊น ๋น์์ ํน์ง์ ์ด์ฉํด์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์๋ค.
ํฐ์นธ์ ์๋ ๋น์์ ํฐ์นธ์ผ๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํ๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒ์์นธ์ ์๋ ๋น์์ ๊ฒ์์นธ์ผ๋ก๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
void setting();
void printBoard();
void solve();
int n, res = 0, cnt = 0;
int board[11][11];
vector<pair<int, int>> arr;
vector<pair<int, int>> bishopPos;
void setting()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> board[i][j];
if (board[i][j] == 1 && (i + j) % 2 == 0) // ๋์ ์ ์๋ ๋น์ ์๋ฆฌ๋ค.
arr.push_back({ i, j });
}
}
}
void printBoard()
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void bishop(int cnt, int L)
{
if (cnt > res)
res = cnt;
if (L == arr.size())
return;
bool flag = true;
for (int i = 0; i < bishopPos.size(); ++i)
{
if (abs(arr[L].first - bishopPos[i].first) == abs(arr[L].second - bishopPos[i].second))
{
flag = false;
break;
}
}
if (flag == true)
{
bishopPos.push_back({ arr[L].first, arr[L].second });
bishop(cnt + 1, L + 1);
bishopPos.pop_back();
}
bishop(cnt, L + 1);
return;
}
void solve()
{
setting();
int ans = 0;
bishop(0, 0);
ans += res;
res = 0;
arr.clear();
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (board[i][j] == 1 && (i + j) % 2 == 1)
arr.push_back({ i, j });
}
}
bishop(0, 0);
ans += res;
res = 0;
arr.clear();
cout << ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}