삐까냥의 파도타기
1767. 프로세서 연결하기 본문
문제 출처 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf
아놔................
resultCpuNum = canCpuNum;
이 한줄을 추가하지 않아, 디버깅 시간 엄청 잡아먹었네요.
다행인건, 생각한 알고리즘의 문제는 아니었네요.
50개의 테스트 케이스 중에서 49개만 맞다고 나오길래,
예외 테스트 케이스만 생각하다보니,.....
왜케 실수를 하지;;;;;;;;;;;
2018년 4월 12일 - 다듬지 않은 코드 (소요시간 1시간 13분) import java.util.Scanner; public class Q1767 { static int mapSize, cpuNum; static int[][] map; static int[][] cpuPositions = new int[12][2];
static int resultCpuNum; static long resultLength; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int testCase = sc.nextInt(); for (int i = 1; i <= testCase; i++) { resultCpuNum = -1; resultLength = 0; mapSize = sc.nextInt(); map = new int[mapSize][mapSize];
cpuNum = 0; for (int j = 0; j < mapSize; j++) { for (int k = 0; k < mapSize; k++) { int value = sc.nextInt(); if (value != 0) { map[j][k] = 1;
cpuPositions[cpuNum][0] = j; cpuPositions[cpuNum][1] = k; cpuNum += 1; } } }
solution(0, 0, 0); System.out.println("#" +i + " "+ resultLength); } } static void solution(int nowCpuNum, int canCpuNum, long tempLength) { if (nowCpuNum == cpuNum) { if (resultCpuNum == -1) { resultCpuNum = canCpuNum; resultLength = tempLength; } else if (resultCpuNum < canCpuNum) { resultCpuNum = canCpuNum; resultLength = tempLength; } else if (resultCpuNum == canCpuNum && resultLength > tempLength) { resultLength = tempLength; } return; }
int nowY = cpuPositions[nowCpuNum][0]; int nowX = cpuPositions[nowCpuNum][1];
if (nowY == 0 || nowY == mapSize-1 || nowX == 0 || nowX == mapSize-1) { //테두리에 붙어있으면 solution(nowCpuNum+1, canCpuNum+1, tempLength); } else { //상 boolean isPossible = true; for (int i = nowY-1; i >=0; i--) { if (map[i][nowX] != 0) { isPossible = false; break; } }
if (isPossible) { for (int i = nowY-1; i >=0; i--) { map[i][nowX] = 1; } solution(nowCpuNum+1, canCpuNum+1, tempLength+nowY); for (int i = nowY-1; i >=0; i--) { map[i][nowX] = 0; } }
//하 isPossible = true; for (int i = nowY+1; i < mapSize; i++) { if (map[i][nowX] != 0) { isPossible = false; break; } }
if (isPossible) { for (int i = nowY+1; i < mapSize; i++) { map[i][nowX] = 1; } solution(nowCpuNum+1, canCpuNum+1, tempLength+(mapSize-1-nowY)); for (int i = nowY+1; i < mapSize; i++) { map[i][nowX] = 0; } }
//좌 isPossible = true; for (int i = nowX-1; i >=0; i--) { if (map[nowY][i] != 0) { isPossible = false; break; } }
if (isPossible) { for (int i = nowX-1; i >=0; i--) { map[nowY][i] = 1; } solution(nowCpuNum+1, canCpuNum+1, tempLength+nowX); for (int i = nowX-1; i >=0; i--) { map[nowY][i] = 0; } }
//우 isPossible = true; for (int i = nowX+1; i < mapSize; i++) { if (map[nowY][i] != 0) { isPossible = false; break; } }
if (isPossible) { for (int i = nowX+1; i < mapSize; i++) { map[nowY][i] = 1; } solution(nowCpuNum+1, canCpuNum+1, tempLength+(mapSize-1-nowX)); for (int i = nowX+1; i < mapSize; i++) { map[nowY][i] = 0; } }
//걍 실행 solution(nowCpuNum+1, canCpuNum, tempLength); } } } |
'코딩 > SW Expert Academy' 카테고리의 다른 글
2382. 미생물 격리 (0) | 2018.04.13 |
---|---|
1949. 등산로 조성 (0) | 2018.04.13 |
3304. 최장 공통 부분 수열 (0) | 2018.03.27 |
2948. 문자열 교집합 (0) | 2018.03.27 |
3975. 승률 비교하기 (0) | 2018.03.27 |