poj 3984- 迷宫问题
来源:互联网 发布:整点报时软件 编辑:程序博客网 时间:2024/05/22 16:55
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <map>#include <algorithm>#define maxn 10 + 10#define ll long long#define INF 1000000000#define FOR(i, a, b) for(int i = a; i < b; ++i)using namespace std;struct Point{ int x, y;} midans[maxn*maxn], finalans[maxn*maxn];int g[maxn][maxn], len_min;bool vis[maxn][maxn];int n;const int move[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};void dfs(int i, int j, int len){ if(i == n-1 && j == n-1) { if(len < len_min) { FOR(k, 0, len) finalans[k].x = midans[k].x, finalans[k].y = midans[k].y; len_min = len; } return; } FOR(k, 0, 4) { int di = i + move[k][0]; int dj = j + move[k][1]; if(di < 0 || dj < 0 || di >= n || dj >= n) continue; if(g[di][dj] == 0 && !vis[di][dj]) { midans[len].x = di; midans[len].y = dj; vis[di][dj] = true; dfs(di, dj, len+1); vis[di][dj] = false; } } return;}int main(){ memset(vis, false, sizeof(vis)); len_min = INF; n = 5; FOR(i, 0, n) FOR(j, 0, n) scanf("%d", &g[i][j]); midans[0].x = 0; midans[0].y = 0; vis[0][0] = true; dfs(0, 0, 1); //printf("Case %d:\n", ++kase); //printf("%d\n", len_min); FOR(i, 0, len_min) printf("(%d, %d)\n", finalans[i].x, finalans[i].y); return 0;}