1600번 말이 되고픈 원숭이

동도리동·2021년 9월 14일
0

코딩테스트

목록 보기
32/76
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <tuple>
#include <cstring>
using namespace std;

int map[201][201];
int dis[201][201][31];
int dx[12] = { 1,-1,0,0,-2,-2,-1,-1,1,1,2,2 };
int dy[12] = { 0,0,1,-1,-1,1,-2,2,-2,2,-1,1 };
int d[12] = { 0,0,0,0,1,1,1,1,1,1,1,1 };
int main() {
	//freopen("in1.txt", "rt", stdin);
	int x, y, c;
	int n, m;
	int key;
	cin >> key;
	cin >> m >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> map[i][j];
		}
	}
	queue<tuple<int, int, int>> Q;
	Q.push(make_tuple(1, 1, 0));
	memset(dis, -1, sizeof(dis));
	dis[1][1][0] = 0;
	while (!Q.empty()) {
		tie(x, y, c) = Q.front();
		Q.pop();
		for (int i = 0; i < 12; i++) {
			int xx = x + dx[i];
			int yy = y + dy[i];
			int cc = c + d[i];
			if (xx > n || xx <= 0 || yy > m || yy <= 0) continue;
			if (map[xx][yy] == 1) continue;
			//if (cc > key) continue;
			if (dis[xx][yy][cc] == -1 && cc <= key) {
				dis[xx][yy][cc] = dis[x][y][c] + 1;
				Q.push(make_tuple(xx, yy, cc));
			}

		}
	}
	int ans = -1;
	for (int i = 0; i <= key; i++) {
		if (dis[n][m][i] == -1) continue;
		if (ans==-1||dis[n][m][i] < ans) ans = dis[n][m][i];
	}
	cout << ans << '\n';
	return 0;
}
profile
긍정코딩세상

0개의 댓글

관련 채용 정보