문제 : https://www.acmicpc.net/problem/1248

 

1248번: 맞춰봐

첫째 줄에 수열의 크기 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 N(N+1)/2 길이의 문자열이 주어진다. 처음 N개의 문자는 부호 배열의 첫 번째 줄에 해당하고, 다음 N-1개의 문

www.acmicpc.net

문제 요약 : 수를 조합하여 주어진 부호에 맞는 숫자 출력

입력 출력
1 ≤ N(숫자) ≤ 10
N(N+1)/2개의 부호 (+, -, 0)
수를 조합하여 주어진 부호에 맞는 숫자 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_1248.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
31114112 cbkpar 1248 맞았습니다!! 16852KB 184ms Java 11 1276B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	static int[][] op;
	static int[] arr;
	static int n;
	static boolean chk;
    static StringBuilder sb = new StringBuilder();
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int i,j,k;
		n = Integer.parseInt(br.readLine());
		op = new int[n][n];
		arr = new int[n+1];
		String str = br.readLine();
		k = 0;
		for(i=0;i<n;i++) {
			for(j=i;j<n;j++) {
				if(str.charAt(k)=='-') {
					op[i][j] = -1;
				}else if(str.charAt(k)=='0') {
					op[i][j] = 0;
				}else {
					op[i][j] = 1;
				}
				k++;
			}
		}
		chk = false;
		btr(0);
		System.out.println(sb);
	}
	
	static void btr(int k) {
		if(chk) return;
		if(k==n) {
			for(int i=1;i<=n;i++) sb.append((arr[i]-arr[i-1])+" ");
			chk = true;
			return;
		}
		int mx = 10;
		int mi = -10;
		for(int i=0;i<=k;i++) {
			if(op[i][k]==-1) {
				mx = Math.min(mx, arr[i]-arr[k]-1);
			}else if(op[i][k]==0) {
				mx = Math.min(mx, arr[i]-arr[k]);
				mi = Math.max(mi, arr[i]-arr[k]);
			}else {
				mi = Math.max(mi, arr[i]-arr[k]+1);
			}
		}
		for(int i=mi;i<=mx;i++) {
			arr[k+1] = arr[k] + i;
			btr(k+1);
		}
	}
}

숫자를 앞에서 부터 가능한 숫자를 구하여 가능한 모든 경우를 확인한다.

 

숫자의 범위가 -10 부터 10이므로 초기값을 최소 -10, 최대 10으로 설정 한 후

해당 순번의 부분합 부호를 확인하며 들어갈 수 있는 최소 또는 최대 값을 수정하며 탐색한다.

 

예제 )

4
-+0++++--+

 

문제 : https://www.acmicpc.net/problem/17825

 

17825번: 주사위 윷놀이

첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.

www.acmicpc.net

문제 요약 : 주사위를 10번 돌려 얻을 수 있는 점수의 최댓값 출력

입력 출력

1 ≤ (주사위 10개) ≤ 5

주사위를 10번 돌려 얻을 수 있는 점수의 최댓값 출력

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16546976 cbkpar 17825 맞았습니다!! 14496KB 84ms Java 2838B
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	
    //현재위치에서 주사위를 굴렸을때 이동할 위치 미리 정해둠
	static int[][] map = {{0,1,2,3,4,5},
			{1,2,3,4,5,6},
			{2,3,4,5,6,7},
			{3,4,5,6,7,8},
			{4,5,6,7,8,9},
			{5,21,22,23,29,30},
			{6,7,8,9,10,11},
			{7,8,9,10,11,12},
			{8,9,10,11,12,13},
			{9,10,11,12,13,14},
			{10,27,28,29,30,31},
			{11,12,13,14,15,16},
			{12,13,14,15,16,17},
			{13,14,15,16,17,18},
			{14,15,16,17,18,19},
			{15,24,25,26,29,30},
			{16,17,18,19,20,32},
			{17,18,19,20,32,32},
			{18,19,20,32,32,32},
			{19,20,32,32,32,32},
			{20,32,32,32,32,32},
			{21,22,23,29,30,31},
			{22,23,29,30,31,20},
			{23,29,30,31,20,32},
			{24,25,26,29,30,31},
			{25,26,29,30,31,20},
			{26,29,30,31,20,32},
			{27,28,29,30,31,20},
			{28,29,30,31,20,32},
			{29,30,31,20,32,32},
			{30,31,20,32,32,32},
			{31,20,32,32,32,32},
			{32,32,32,32,32,32}};
    //정해둔 위치에 도착했을 때 더할 점수
	static int[] score = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,
			34,36,38,40,13,16,19,28,27,26,22,24,25,30,35,0};
	static int a=0;
	static int b=0;
	static int c=0;
	static int d=0;
	static int m=0;
	static int[] chk = new int[33];
	static int[] move = new int[10];
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int i;
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(i=0;i<10;i++) move[i]=Integer.parseInt(st.nextToken());
		chk[32]=-10;
		if(move[0]==move[1]) {
        //첫번째와 두번째 이동이 같다면 처음에 이동한말이 한번더 이동해야하는 사실은 자명하다.
			chk[map[move[0]][move[0]]]++;
			a=map[move[0]][move[0]];
			dfs(score[move[0]]+score[a],2);
		}else {
        //첫번째와 두번째 이동이 다르다면 처음이동한말이 이동하거나 새로운말이 이동하는 경우 2가지이다.
			chk[move[0]]++;
			chk[move[1]]++;
			a=move[0];
			b=move[1];
			dfs(score[a]+score[b],2);
			chk[move[0]]--;
			chk[move[1]]--;
			chk[map[move[0]][move[1]]]++;
			a=map[move[0]][move[1]];
			b=0;
			dfs(score[move[0]]+score[map[move[0]][move[1]]],2);
		}
		bw.write(m+"\n");
		br.close();
		bw.close();
	}
	
	static void dfs(int sum, int k) {
		if(k==10) {
        //10번 다 돌렸을 경우 최댓값 갱신 후 리턴
			m = Math.max(m, sum);
			return;
		}
		int tmp,tmp2;
		tmp = map[a][move[k]];
		if(chk[tmp]!=1) { // 이동가능 여부 파악
			chk[tmp]++; // 이동한 위치 말 추가
			chk[a]--; // 현재 위치 말 제거
			tmp2=a;
			a=tmp;
			dfs(sum+score[tmp],k+1); // 점수를 더하고 재귀
			a=tmp2;
			chk[a]++; // 현재 위치 말 추가
			chk[tmp]--; //이동한 위치 말 제거
		}
		tmp = map[b][move[k]];
		if(chk[tmp]!=1) {
			chk[tmp]++;
			chk[b]--;
			tmp2=b;
			b=tmp;
			dfs(sum+score[tmp],k+1);
			b=tmp2;
			chk[b]++;
			chk[tmp]--;
		}
		tmp = map[c][move[k]];
		if(chk[tmp]!=1) {
			chk[tmp]++;
			chk[c]--;
			tmp2=c;
			c=tmp;
			dfs(sum+score[tmp],k+1);
			c=tmp2;
			chk[c]++;
			chk[tmp]--;
		}
		tmp = map[d][move[k]];
		if(chk[tmp]!=1) {
			chk[tmp]++;
			chk[d]--;
			tmp2=d;
			d=tmp;
			dfs(sum+score[tmp],k+1);
			d=tmp2;
			chk[d]++;
			chk[tmp]--;
		}
	}
}

위와 같은 방식을 사용하지않고 10번을 모두 dfs로 풀 수 있다.

이때 경우의수는 4^10 = 1048576 이게 되지만

 

첫번째 수는 어떤 말이 이동해도 결과는 같기때문에 첫번째 말이 이동했다고 가정하고 풀게되면

경우의수는 4^9로 262144번만 계산하면 된다.

 

또한 2번째 수 까지 고려했을때

첫번째 두번째 주사위가 같은 수 일경우 처음이동한 말이 또 이동해야 하며

첫번째 두번째 주사위가 다른 수 일경우 처음이동한말이 이동을 다시하거나 새로운말이 이동할경우로 나누어주면

 

총 3 * 65536 = 196608의 경우의수가 생기게 된다.

문제 : https://www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선이 같은 위치를 갖는다. 아래 그림은 N = 5, H = 6 인 경우의 그림이고, 가로선은 없다. 초록선은 세로선을 나타내고, 초록선과 점선이 교차하는 점은 가로선을 놓을 수 있는 점이다. 가로선은 인접한 두 세로선을 연결해야 한다. 단, 두 가로선이 연속하거나 서로

www.acmicpc.net

 

문제 요약 : i번째로 출발해 i가 나오도록 선을 긋는 최소 횟수

입력 출력

2 ≤ N(열) ≤ 10

1 ≤ H(행) ≤ 30

0 ≤ M(사다리) ≤ (N-1)*H

M개의 사다리값 

i번째로 출발해 i가 나오게 만드는 최소 조작 횟수 

 

 

JAVA - 수정 후

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16394816 cbkpar 15684 맞았습니다!! 15592KB 1796ms Java 1628B
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	static int n,m,h;
	static int[][] ladder;
	static int ans = 4;
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int i;
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		h = Integer.parseInt(st.nextToken());

		ladder = new int[h][n];
		
		for(i=0;i<m;i++) {
			st = new StringTokenizer(br.readLine());
			ladder[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1]=1;
		}
		if(m==0) {
			ans=0;
		}else {
		dfs(0,0);
		}
		ans=ans==4?-1:ans;
		bw.write(ans+"\n");
		br.close();
		bw.close();
	}
	static void dfs(int w, int k) {
		if(k>=ans) return; // 현재까지 구한 최솟값보다 같거나 크면 리턴
		int i;
		for(i=0;i<n-1;i++) { //n-1개가 똑같다면 나머지 하나는 당연히 같으므로 n까지 조사하지 않음
			int tmp = i;
			for(int j=0;j<h;j++) {
				if(ladder[j][tmp]==1) {//현재위치에 사다리가 있다면 오른쪽으로 한칸
					tmp++;
					continue;
				}
				if(tmp==0) continue;
				if(ladder[j][tmp-1]==1) {//현재위치-1에 사다리가 있으면 왼쪽으로 한칸
					tmp--;
					continue;
				}
			}
			if(tmp!=i) break;//시작한 사다리가 끝난 사다리와 다르면 종료
		}
		if(i==n-1&&k<ans) {//맞은 개수가 n-1개라면
			ans = k;
			return;
		}
		for(i=w;i<n*h;i++) {
			int dy = i/n;//초기값을 행렬안에 적지 않고 밖에 공통으로 적어줌
			int dx = i%n;
			if(i%n>0) {
				if(ladder[dy][dx-1]==1) continue; //왼쪽에 사다리가 있을경우 다음으로
			}
			if(i%n>=n-1) continue; //마지막에는 더이상 마지막으로 갈 수 없으므로 다음으로
			if(ladder[dy][dx+1]==1) continue; //오른쪽에 사다리가 있을 경우 다음으로
			if(ladder[dy][dx]==0) {
				ladder[dy][dx]=1;
				dfs(i+2,k+1);
                //사다리를 추가했을경우 연속할 수 없으므로 i+1이아닌 i+2로 한다.
				ladder[dy][dx]=0;
			}
		}
	}
}

느낀점 1: dy dx의 경우 i/n, i%n으로 행렬식 안에 넣었지만 이렇게 할경우 연산이 많아진다는 점 확인

 

느낀점 2: 연속할 경우에는 i+1번째가 아닌 그다음을 검사해도 된다.

 

느낀점 3: 1개만 틀릴 수 있는 경우는 존재 하지 않으므로 1번부터 n번까지 조사하지 않아도 된다.

 

느낀점 4:세로로 푸는것이아닌 가로로도 푸는 방법이 존재한다 행마다 열이 있는경우 결과를 바꿔주면된다.

//하지만 중간에 결과를 알 수 없고 끝까지 검사를 해야 한다는 단점이 있음

 

느낀점 5: 리스트로 미리 빈칸을 받거나 조건문을 개선하면 시간을 많이 단축 할 수 있을 것 같다.

 

 

 

 

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16385137 cbkpar 15684 맞았습니다!! 15812KB 2036ms Java 1549B
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	static int n,m,h;
	static int[][] ladder;
	static int ans = 4;
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int i;
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		h = Integer.parseInt(st.nextToken());

		ladder = new int[h][n];
		
		for(i=0;i<m;i++) {
			st = new StringTokenizer(br.readLine());
			ladder[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1]=1;
		}
		dfs(0,0);
		ans=ans==4?-1:ans;
		bw.write(ans+"\n");
		br.close();
		bw.close();
	}
	static void dfs(int w, int k) {
		if(k>=ans) return;
		int i;
		for(i=0;i<n;i++) {
			int tmp = i;
			for(int j=0;j<h;j++) {
				if(ladder[j][tmp]==1) {
					tmp++;
					continue;
				}
				if(tmp==0) continue;
				if(ladder[j][tmp-1]==1) {
					tmp--;
					continue;
				}
			}
			if(tmp!=i) break;
		}
		if(i==n) ans=Math.min(ans, k);
		for(i=w;i<n*h;i++) {
			if(i%n>0) {
				if(ladder[i/n][i%n-1]==1) continue;
			}
			if(i%n>=n-1) continue;
			if(ladder[i/n][i%n+1]==1) continue;
			if(ladder[i/n][i%n]==0) {
				ladder[i/n][i%n]=1;
				dfs(i+1,k+1);
				ladder[i/n][i%n]=0;
			}
		}
	}
}

문제 : https://www.acmicpc.net/problem/13460

 

13460번: 구슬 탈출 2

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' 로 이루어져 있다. '.'은 빈 칸을 의미하고, '#'은 공이 이동할 수 없는 장애물 또는 벽을 의미하며, 'O'는 구멍의 위치를 의미한다. 'R'은 빨간 구슬의 위치, 'B'는 파란 구슬의 위치이다. 입력되는 모든 보드

www.acmicpc.net

 

문제 요약 : 판 위에 빨간구슬과 파란구슬이 있고 최소로 기울여서 빨간구슬만 빼내는 횟수

입력 출력

첫째 줄에 세로, 가로 크기 N, M (3 ≤ N, M ≤ 10)

N개의 줄에 길이 M의 문자열 ['.', '#', 'O', 'R', 'B']

'.' 빈 칸

'#' 장애물

'O'는 구멍 [1개]

'R' 빨간 구슬 [1개]

'B'는 파란 구슬 [1개]

보드의 가장자리에는 모두 '#'

빨간 구슬을 구멍을 통해 빼낼 수 있는는 최소 횟수 출력

10번 초과 또는 불가능 하면 -1을 출력

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16324321 cbkpar 13460 맞았습니다!! 17396KB 100ms Java 4049B
import java.io.*;

public class Main {
	static int[][] map; // 보드판
	static int y,x,gy,gx; // 보드판 넓이, 구멍 위치
	static int move = 11; // 최대 횟수 지정

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int i,j;
		int y1 = 0,x1 = 0 ,y2 = 0,x2 = 0;
		
		String str = "";
		
		str = br.readLine();
		String[] arr = str.split(" ");
		y = Integer.parseInt(arr[0]);
		x = Integer.parseInt(arr[1]);
		map = new int[y][x]; // 보드판 크기 설정
		for(i=0;i<y;i++) {
			str = br.readLine();
			for(j=0;j<x;j++) {
				if(str.charAt(j)=='#') {
					map[i][j] = 0; // 0은 이동불가
				}else if(str.charAt(j)=='.') {
					map[i][j] = 1; // 1은 이동가능
				}else if(str.charAt(j)=='R') {
					y1 = i; //빨간구슬 y좌표
					x1 = j; //빨간구슬 x좌표
					map[i][j] = 0;
				}else if(str.charAt(j)=='B') {
					y2 = i; //파란구슬 y좌표
					x2 = j; //파란구슬 x좌표
					map[i][j] = 0;
				}else {
					gy = i; //구멍 y좌표
					gx = j; //구멍 x좌표
					map[i][j] = 1;
				}
			}
		}
		dfs(y1,x1,y2,x2,0); // 깊이우선검색
		if(move==11) { //10번 초과나 불가능하다면
			System.out.println("-1");
		}else {
			System.out.println(move);
		}
	}
	static void dfs(int ry, int rx, int by, int bx, int k) {
		if(k>=move) return; //지금까지 찾은 최소횟수보다 크다면 리턴
		if(by==gy&&bx==gx) return; // 파란공이 빠졌다면 리턴
		if(ry==gy&&rx==gx) {  // 파란공이 빠지지 않고 빨간공이 빠졌다면
			move = Math.min(move, k); // 최소횟수 수정 후 리턴
			return;
		}
		
        
        //공이 위로 갈때
		int ir = ry; // 빨간공 y좌표
		int ib = by; // 파란공 y좌표
		while(true) {
			if(ir==gy&&rx==gx) break; // 구멍이면 종료
			if(map[ir-1][rx]==1) { // 이동가능 하다면
				map[ir][rx] = 1;
				ir-=1;
				map[ir][rx] = 0;
				if(ir==gy&&rx==gx) map[ir][rx] = 1; //구멍이면 다시 이동가능하게 설정
			}else { //이동이 불가능하면 종료
				break;
			}
		}
		while(true) {
			if(ib==gy&&bx==gx) break;
			if(map[ib-1][bx]==1) {
				map[ib][bx] = 1;
				ib-=1;
				map[ib][bx] = 0;
				if(ib==gy&&bx==gx) map[ib][bx] = 1;
			}else {
				break;
			}
		}
        //빨간공 파란공 빨간공 순서로 한번더 해주어서 예외상황 방지
        //파란공 빨간공 파란공 순서로 해도 결과 같음
		while(true) {
			if(ir==gy&&rx==gx) break;
			if(map[ir-1][rx]==1) {
				map[ir][rx] = 1;
				ir-=1;
				map[ir][rx] = 0;
				if(ir==gy&&rx==gx) map[ir][rx] = 1;
			}else {
				break;
			}
		}
		if(ir!=ry||ib!=by) dfs(ir,rx,ib,bx,k+1); // 횟수증가후 탐색
		//이동 했던 공들 원위치
        map[ir][rx]=1;
		map[ib][bx]=1;
		map[ry][rx]=0;
		map[by][bx]=0;

		//아래로 공이 이동할때
		ir = ry;
		ib = by;
		while(true) {
			if(ir==gy&&rx==gx) break;
			if(map[ir+1][rx]==1) {
				map[ir][rx] = 1;
				ir+=1;
				map[ir][rx] = 0;
				if(ir==gy&&rx==gx) map[ir][rx] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(ib==gy&&bx==gx) break;
			if(map[ib+1][bx]==1) {
				map[ib][bx] = 1;
				ib+=1;
				map[ib][bx] = 0;
				if(ib==gy&&bx==gx) map[ib][bx] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(ir==gy&&rx==gx) break;
			if(map[ir+1][rx]==1) {
				map[ir][rx] = 1;
				ir+=1;
				map[ir][rx] = 0;
				if(ir==gy&&rx==gx) map[ir][rx] = 1;
			}else {
				break;
			}
		}
		if(ir!=ry||ib!=by) dfs(ir,rx,ib,bx,k+1);
		map[ir][rx]=1;
		map[ib][bx]=1;
		map[ry][rx]=0;
		map[by][bx]=0;
		
        //왼쪽으로 공이 이동할때
		ir = rx;
		ib = bx;
		while(true) {
			if(ry==gy&&ir==gx) break;
			if(map[ry][ir-1]==1) {
				map[ry][ir] = 1;
				ir-=1;
				map[ry][ir] = 0;
				if(ry==gy&&ir==gx) map[ry][ir] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(by==gy&&ib==gx) break;
			if(map[by][ib-1]==1) {
				map[by][ib] = 1;
				ib-=1;
				map[by][ib] = 0;
				if(by==gy&&ib==gx) map[by][ib] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(ry==gy&&ir==gx) break;
			if(map[ry][ir-1]==1) {
				map[ry][ir] = 1;
				ir-=1;
				map[ry][ir] = 0;
				if(ry==gy&&ir==gx) map[ry][ir] = 1;
			}else {
				break;
			}
		}
		if(ir!=rx||ib!=bx) dfs(ry,ir,by,ib,k+1);
		map[ry][ir]=1;
		map[by][ib]=1;
		map[ry][rx]=0;
		map[by][bx]=0;
		
        //오른쪽으로 공이 이동 할 때
		ir = rx;
		ib = bx;
		while(true) {
			if(ry==gy&&ir==gx) break;
			if(map[ry][ir+1]==1) {
				map[ry][ir] = 1;
				ir+=1;
				map[ry][ir] = 0;
				if(ry==gy&&ir==gx) map[ry][ir] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(by==gy&&ib==gx) break;
			if(map[by][ib+1]==1) {
				map[by][ib] = 1;
				ib+=1;
				map[by][ib] = 0;
				if(by==gy&&ib==gx) map[by][ib] = 1;
			}else {
				break;
			}
		}
		while(true) {
			if(ry==gy&&ir==gx) break;
			if(map[ry][ir+1]==1) {
				map[ry][ir] = 1;
				ir+=1;
				map[ry][ir] = 0;
				if(ry==gy&&ir==gx) map[ry][ir] = 1;
			}else {
				break;
			}
		}
		if(ir!=rx||ib!=bx) dfs(ry,ir,by,ib,k+1);
		map[ry][ir]=1;
		map[by][ib]=1;
		map[ry][rx]=0;
		map[by][bx]=0;
	}
}

'백준온라인' 카테고리의 다른 글

[백준온라인] 12100번 2048 (Easy)  (0) 2019.12.03
[백준온라인] 2884번 알람 시계  (0) 2019.12.02
[백준온라인] 1008번 A/B  (0) 2019.12.01
[백준온라인] 10998번 A×B  (0) 2019.12.01
[백준온라인] 1001번 A-B  (0) 2019.12.01

+ Recent posts