タイトル1672:迷宮問題【データ構造】
16878 ワード
タイトルの出所:C言語網Look!I’m back.I have watch ed may foreign Serious.That’s really make a big difference for me~
テーマの説明
明さんは迷路にいます.出発点から終点までの最短距離を探してください.明さんは上下左右の四つの方向にしか動かないです.
入力
複数のグループのテストデータを入力します.入力の最初の行は整数Tで、Tグループのテストデータがあることを表しています.各グループの入力の最初の行は2つの整数NとM(1<=N,M<=100)である.次のN行には、各行にM文字が入力され、各文字は迷路の中の小さい四角形を表します.文字の意味は以下の通りです.「S」:起点「E」:終点「-」:空き地は、「胪」を通じてできます.障害は、データを入力することによって保証できず、スタートとゴールしかないです.
出力
各グループの入力に対して、起点から終点までの最短距離を出力します.起点から終点までの道がなければ、-1を出力します.
サンプル入力
9
コードAND Analysis
First、it is a grapph trversal and use the Depth First Traversal algorithm.For the dfs function、there are many probles which are really hidden.DFS考え方は、現在位置の合法性を判断する2、遍歴を続ける必要があるかどうかを判断することです.現在の位置が終点位置かどうかを判断します.終点ではなく、現在の位置の上、下、左、右を巡回します.
関連する操作問題:第2と第3のステップを組み合わせて、最終記録の終了位置を保証するステップ数は最も少ない. による次のステップの走向は、それぞれx方向とy方向の循環の2つの層の循環であるが、両者のうち1つが0であり、1つが0でないことを保証する.これは毎回一歩しか歩けないからです.絶対値で判断できる: は、このステップが重要かもしれません.(場合によっては)まず、キーボードバッファと関数 を読み取ります.
テーマの説明
明さんは迷路にいます.出発点から終点までの最短距離を探してください.明さんは上下左右の四つの方向にしか動かないです.
入力
複数のグループのテストデータを入力します.入力の最初の行は整数Tで、Tグループのテストデータがあることを表しています.各グループの入力の最初の行は2つの整数NとM(1<=N,M<=100)である.次のN行には、各行にM文字が入力され、各文字は迷路の中の小さい四角形を表します.文字の意味は以下の通りです.「S」:起点「E」:終点「-」:空き地は、「胪」を通じてできます.障害は、データを入力することによって保証できず、スタートとゴールしかないです.
出力
各グループの入力に対して、起点から終点までの最短距離を出力します.起点から終点までの道がなければ、-1を出力します.
サンプル入力
1
5 5
S-###
-----
##---
E#---
---##
サンプル出力9
コードAND Analysis
First、it is a grapph trversal and use the Depth First Traversal algorithm.For the dfs function、there are many probles which are really hidden.DFS考え方は、現在位置の合法性を判断する2、遍歴を続ける必要があるかどうかを判断することです.現在の位置が終点位置かどうかを判断します.終点ではなく、現在の位置の上、下、左、右を巡回します.
関連する操作問題:
(vi[x][y] == 0 || vi[x][y] > step)
stepIndex = abs(mx) + abs(my); stepIndex == 1
の役割を明確にして、文字以外の読み取りを行うと、リターンスペースなどがキーボードバッファに保存されます.このときはfflush(stdin)
を使って#include
#include
#define MAXN 100
char dg[MAXN + 1][MAXN + 1];
int vi[MAXN + 1][MAXN + 1] = {
0 };
int stx, sty, endx, endy;
int dfs(int row, int col, int x, int y, int step)
{
//
if (x < 0 || y < 0 || x >= row || y >= col || vi[x][y] == -1) return 0;
//
if (vi[x][y] == 0 || vi[x][y] > step) vi[x][y] = step;
else return 0;
if (dg[x][y] == 'E') return 0;
int mx, my;
for (mx = -1; mx <= 1; mx++) {
for (my = -1; my <= 1; my++) {
//mx my 0 0
// 0 mx 0
if ((mx && my) || (mx == 0 && my == 0)) continue;
dfs(row, col, x + mx, y + my, step + 1);
}
}
return 1;
}
int solve(int row, int col)
{
int ans;
dfs(row, col, stx, sty, 0);
ans = vi[endx][endy];
ans = ans ? ans : -1;
return ans;
}
int main()
{
int L, i, j, row, col, ans;
scanf("%d", &L);
//
getchar();
while (L--) {
memset(vi, 0, sizeof(vi));
//
scanf("%d %d", &row, &col);
//
getchar();
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
dg[i][j] = getchar();
if (dg[i][j] == 'S') {
stx = i; sty = j;
}
if (dg[i][j] == 'E') {
endx = i; endy = j;
}
if (dg[i][j] == '#') {
vi[i][j] = -1;
}
}
//
getchar();
}
ans = solve(row, col);
printf("%d
", ans);
}
}