Notice
Recent Posts
Recent Comments
Link
Dev.baelanche
[백준 15683] 감시 본문
반응형
감시카메라가 감시 가능한 모든 지역을 탐색하게 한다.
1번은 4가지 경우, 2번은 2가지, 3번은 4가지, 4번도 4가지, 5번은 1가지 경우가 있다.
모든 경우를 완전탐색하기만 하면 되는 문제인데 구현이 좀 까다롭다.
public class Main {
static int n;
static int m;
static ArrayList<Camera> cctv = new ArrayList<Camera>();
static int ans = Integer.MAX_VALUE;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int a[][] = new int[n][m];
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++) {
a[i][j] = Integer.parseInt(st.nextToken());
if(a[i][j] != 0 && a[i][j] != 6) cctv.add(new Camera(i, j, a[i][j]));
}
}
bruteforce(0, 0, a);
System.out.println(ans);
}
public static void bruteforce(int idx, int cnt, int a[][]) {
if(cnt == cctv.size()) {
int c = 0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(a[i][j] == 0)
c++;
ans = Math.min(ans, c);
return;
}
int temp[][] = new int[n][m];
for(int i=idx; i<cctv.size(); i++) {
int no = cctv.get(i).no;
if(no == 1) {
for(int j=0; j<4; j++) {
for(int k=0; k<n; k++)
for(int l=0; l<m; l++)
temp[k][l] = a[k][l];
camera(cctv.get(i), j, temp);
bruteforce(i+1, cnt+1, temp);
}
}
if(no == 2) {
for(int j=0; j<2; j++) {
for(int k=0; k<n; k++)
for(int l=0; l<m; l++)
temp[k][l] = a[k][l];
camera(cctv.get(i), j, temp);
camera(cctv.get(i), j+2, temp);
bruteforce(i+1, cnt+1, temp);
}
}
if(no == 3) {
for(int j=0; j<4; j++) {
for(int k=0; k<n; k++)
for(int l=0; l<m; l++)
temp[k][l] = a[k][l];
camera(cctv.get(i), j, temp);
camera(cctv.get(i), (j+1)%4, temp);
bruteforce(i+1, cnt+1, temp);
}
}
if(no == 4) {
for(int j=0; j<4; j++) {
for(int k=0; k<n; k++)
for(int l=0; l<m; l++)
temp[k][l] = a[k][l];
camera(cctv.get(i), j, temp);
camera(cctv.get(i), (j+1)%4, temp);
camera(cctv.get(i), (j+2)%4, temp);
bruteforce(i+1, cnt+1, temp);
}
}
if(no == 5) {
for(int j=0; j<4; j++) {
for(int k=0; k<n; k++)
for(int l=0; l<m; l++)
temp[k][l] = a[k][l];
camera(cctv.get(i), 0, temp);
camera(cctv.get(i), 1, temp);
camera(cctv.get(i), 2, temp);
camera(cctv.get(i), 3, temp);
bruteforce(i+1, cnt+1, temp);
}
}
}
}
/* d
* 0 : 위
* 1 : 우측
* 2 : 아래
* 3 : 좌측
* */
public static void camera(Camera c, int d, int a[][]) {
int x = c.r;
int y = c.c;
if(d == 0) {
while(x >= 0) {
if(a[x][y] == 6) break;
a[x][y] = 7;
x--;
}
}
if(d == 1) {
while(y < m) {
if(a[x][y] == 6) break;
a[x][y] = 7;
y++;
}
}
if(d == 2) {
while(x < n) {
if(a[x][y] == 6) break;
a[x][y] = 7;
x++;
}
}
if(d == 3) {
while(y >= 0) {
if(a[x][y] == 6) break;
a[x][y] = 7;
y--;
}
}
}
static class Camera {
int r;
int c;
int no;
Camera(int r, int c, int no) {
this.r = r;
this.c = c;
this.no = no;
}
}
}
반응형
'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글
[백준 2588] 곱셈 (0) | 2019.06.25 |
---|---|
[백준 10171] 고양이 (0) | 2019.06.25 |
[백준 15686] 치킨 배달 (0) | 2019.06.25 |
[백준 17142] 연구소 3 (0) | 2019.06.25 |
[백준 14891] 톱니바퀴 (0) | 2019.06.24 |
Comments