알고리즘/SW Expert Academy

1949. [모의 SW 역량테스트] 등산로 조성

혬혬 2020. 12. 2. 13:40
728x90

41개에 오답이 뜬다면, visit 체크를 해보길 바랍니다... 

등산로에 포함된 길을 깍으면 안되기 때문입니다. 

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

typedef struct node {
	int i;
	int j;
};
int dx[] = { 0,-1,0,1 };
int dy[] = { 1,0,-1,0 };
int max_length = 0;
void search(vector<vector<int>> map,node point,int possible,int count,vector<vector<int>> visit) {
	
	for (int k = 0; k < 4; k++) {
		if (point.i + dx[k] >= 0 && point.i + dx[k] < map.size() && point.j + dy[k] >= 0 && point.j + dy[k] < map.size()) {
			if (visit[point.i + dx[k]][point.j + dy[k]] == 1)
				continue;
			if (map[point.i + dx[k]][point.j + dy[k]] < map[point.i][point.j] ) {
				visit[point.i + dx[k]][point.j + dy[k]] = 1;
				search(map, { point.i + dx[k],point.j + dy[k] }, possible, count + 1,visit);
				visit[point.i + dx[k]][point.j + dy[k]] = 0;
			}
			else if (possible != -1 && map[point.i][point.j] <= map[point.i + dx[k]][point.j + dy[k]]) {
				if (map[point.i + dx[k]][point.j + dy[k]] - map[point.i][point.j] < possible) {
					int box = map[point.i + dx[k]][point.j + dy[k]];
					map[point.i + dx[k]][point.j + dy[k]] = map[point.i][point.j]-1;
					visit[point.i + dx[k]][point.j + dy[k]] = 1;
					search(map, { point.i + dx[k],point.j + dy[k] }, -1, count + 1,visit);
					map[point.i + dx[k]][point.j + dy[k]] = box;
					visit[point.i + dx[k]][point.j + dy[k]] = 0;
				}
			}
		}
	}
	if (count > max_length) {
		max_length = count;
	}
}


int main() {
	int tc = 0;
	cin >> tc;
	for (int p =1; p <= tc; p++) {
		int N, K;
		cin >> N >> K;
		max_length = 0;
		vector<vector<int>> map;
		vector<node> list;
		vector<vector<int>> visit;
		int max = 0;
		for (int i = 0; i < N; i++) {
			vector<int> a;
			vector<int> b;
			for (int j = 0; j < N; j++) {
				int box = 0;
				cin >> box;
				a.push_back(box);
				b.push_back(0);
				if (box > max) {
					list.clear();
					max = box;
					list.push_back({ i,j });
				}
				else if (box == max) {
					list.push_back({ i,j });
				}
			}
			map.push_back(a);
			visit.push_back(b);
		}
		for (int i = 0; i < list.size(); i++) {
			visit[list[i].i][list[i].j] = 1;
			search(map, list[i],K,1,visit);
			visit[list[i].i][list[i].j] = 0;
		}
		cout <<"#"<<p<<" "<< max_length<<endl;
	}
	return 0;
}
728x90