bfs 문제였습니다.
저는 몇 가지 실수를 해서................. 오래 걸렸지만.........
그렇게 어려운 문제는 아닌 것 같습니다.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <math.h> #include <queue> #include <set> #include <list> #include <utility> #include <functional> #define MAX 405 #define INF 987654321 #define MOD 1000000009 #pragma warning(disable:4996) using namespace std; typedef long long ll; typedef pair<int, int> pi; int mx, my, x, y, ans = INF; bool visit[MAX][MAX]; pi dp[MAX][MAX]; queue<pi> q; int dx[8] = { 2,2,1,-1,-2,-2,1,-1 }, dy[8] = { -1,1,2,2,1,-1,-2,-2 }; // bfs를 기존에 많이 쓰는 4방향이 아닌 8방향에 대해서 준비한다. int main() { scanf("%d%d", &my, &mx); visit[1][1] = true; dp[1][1].second = 1; q.push(make_pair(1, 1)); // 처음 노드를 넣어준다. while (!q.empty()) { x = q.front().first, y = q.front().second; q.pop(); for (int i = 0; i < 8; i++) // 8방향에 대해서 돌려준다. { int tmp_x = x + dx[i], tmp_y = y + dy[i]; if ((1 <= tmp_x && tmp_x <= mx) && (1 <= tmp_y && tmp_y <= my)) { if (visit[tmp_y][tmp_x] == false || dp[tmp_y][tmp_x].first == dp[y][x].first + 1) { dp[tmp_y][tmp_x].second = (ll)(dp[tmp_y][tmp_x].second + dp[y][x].second) % MOD; // 가짓수를 갱신해준다. if (visit[tmp_y][tmp_x] == false) // 첫 방문일때 { dp[tmp_y][tmp_x].first = dp[y][x].first + 1; // 이동한 거리를 갱신해준다. q.push(make_pair(tmp_x, tmp_y)); visit[tmp_y][tmp_x] = true; } } } } } if (dp[my][mx].second == 0) printf("None\n"); else printf("%d %d\n", dp[my][mx].first, dp[my][mx].second); return 0; }
'IT > BOJ' 카테고리의 다른 글
백준(BOJ) 15787 기차가 어둠을 헤치고 은하수를 ** (0) | 2018.06.02 |
---|---|
백준(BOJ) 11726 2*n 타일링 ** (0) | 2018.06.01 |
백준(BOJ) 2449 전구 *** (0) | 2018.06.01 |
백준(BOJ) 1026 보물섬 ** (0) | 2018.06.01 |
백준(BOJ) 2294 동전 2 ** (0) | 2018.06.01 |