https://www.acmicpc.net/problem/15686

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

다시한번 문제를 풀어봤습니다. 다시 풀었는데도 한번에 못푸는거 보면  이 알고리즘에 대해서 부족하다는걸 다시 한번 느끼네요. 

struct Data {
	int i;
	int j;
};

struct gData {
	vector<int>save;
};


int n, m;
vector<vector<int>>maps;
vector<Data>chickHouse;
vector<Data>House;
vector<bool>bVisited;
vector<int>save;
vector<vector<int>>gsave;
vector<int>mins;
void backtracking(int k,int cnt) {
	if (m == cnt) {
		gsave.push_back(save);
	
	}
	//cout << k << ",";
	for (int i = k; i < chickHouse.size(); i++) {
		if (bVisited[i] == false) {
			bVisited[i] = true;
			save.push_back(i);
			backtracking(i, cnt + 1);
			save.pop_back();
			bVisited[i] = false;
		}
	}

}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//nxn
	//도시 1x1
	//rc 
	cin >> n >> m;
	
	for (int i = 0; i < n; i++) {
		vector<int>tmpMaps;
		for (int j = 0; j < n; j++) {
			int tmp;
			cin >> tmp;
			if (tmp == 2) {
				Data d;
				d.i = i;
				d.j = j;
				chickHouse.push_back(d);
				bVisited.push_back(false);
			}
			if ( tmp == 1 ) {
				Data d;
				d.i = i;
				d.j = j;
				House.push_back(d);
				mins.push_back(-1);
			}
			tmpMaps.push_back(tmp);
		}
		maps.push_back(tmpMaps);
	}
	//r1-r2+c1+c2
	//0빈칸 1은 집 2는 치킨집
	//치킨집 최대갯수 m개 
	//도시의 치킨 거리
	backtracking(0, 0);
	
	//거리값계산
   int gsum = -1;
	for (int i = 0; i < gsave.size(); i++) {
		int sums = 0;
		for (int t = 0; t < House.size(); t++) {
			int mins = -1;
			for (int j = 0; j < gsave[i].size(); j++) {
				int r = chickHouse[gsave[i][j]].i+1;
				int c = chickHouse[gsave[i][j]].j+1;
				int tmpmin = abs(House[t].i+1 - r) + abs(House[t].j+1 - c);
					
				if (mins == -1) {
					mins = tmpmin;
				}
				else {
					mins = min(mins, tmpmin);
				}
			}
			sums += mins;
			}
			if (gsum == -1) {
				gsum = sums;
			}
			else {
				gsum = min(sums, gsum);
			}
			
		}
		cout << gsum ;
	return 0;
}

'알고리즘 공부' 카테고리의 다른 글

백준 로봇 청소기(복습)  (0) 2023.10.12
백준 퇴사 2(복습)  (0) 2023.10.12
백준 주사위  (1) 2023.10.07
백준 암호 만들기  (0) 2023.10.05
백준 트리의 지름  (0) 2023.10.05

+ Recent posts