SDUTOJ2779_找朋友(BFS | | DFS双解法)
找朋友
Time Limit:?1000 ms?Memory Limit:?65536 KiB
Submit?Statistic
Problem Description
X,作為戶外運動的忠實愛好者,總是不想呆在家里。現(xiàn)在,他想把死宅Y從家里拉出來。問從X的家到Y(jié)的家的最短時間是多少。
為了簡化問題,我們把地圖抽象為n*m的矩陣,行編號從上到下為1 到 n,列編號從左到右為1 到 m。矩陣中’X’表示X所在的初始坐標,’Y’表示Y的位置 , ’#’表示當前位置不能走,’ * ’表示當前位置可以通行。X每次只能向上下左右的相鄰的 ’*’ 移動,每移動一次耗時1秒。
Input
多組輸入。每組測試數(shù)據(jù)首先輸入兩個整數(shù)n,m(1<= n ,m<=15 )表示地圖大小。接下來的n 行,每行m個字符。保證輸入數(shù)據(jù)合法。
Output
若X可以到達Y的家,輸出最少時間,否則輸出 -1。
Sample Input
3 3 X#Y *** #*# 3 3 X#Y *#* #*#Sample Output
4 -1Hint
?
Source
zmx
?
BFS:
挨層遍歷
#include <bits/stdc++.h> using namespace std; struct node {int x, y, step; // 用結(jié)構(gòu)體存坐標 和 步長 }; int n, m; char gra[16][16]; // 臨接表 int cat[16][16]; /*定義方向數(shù)組*/ int gotox[4] = {0, 0, 1, -1}; int gotoy[4] = {1, -1, 0, 0};int bfs(int a, int b) {cat[a][b] = 1;node t = {a, b, 0};queue<node> q;q.push(t);while (!q.empty()){node temp = q.front();q.pop();if (gra[temp.x][temp.y] == 'Y')return temp.step;for (int i = 0; i < 4; i++) // 遍歷四個方向{node d;d.x = temp.x + gotox[i];d.y = temp.y + gotoy[i];d.step = temp.step + 1;if (d.x >= 0 && d.x < n && d.y >= 0 && d.y < m && !cat[d.x][d.y] && gra[d.x][d.y] != '#'){q.push(d);cat[d.x][d.y] = 1;}}}return -1; } int main() {ios::sync_with_stdio(false);while (cin >> n >> m){int a, b;memset(cat, 0, sizeof(cat));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> gra[i][j];if (gra[i][j] == 'X') // 找出起點{a = i;b = j;}}}cout << bfs(a, b) << endl;}return 0; }DFS:
對于最新發(fā)現(xiàn)的頂點,如果它還有以此為起點還有 未發(fā)現(xiàn)的邊,就繼續(xù)搜索下去。直到當前點的所有方向都已搜索完畢不符合條件了,就往前回溯,訪問過的? 點標記為0。
#include <bits/stdc++.h> #define INF INT_MAX using namespace std; int n, m, ans, MIN; char gra[16][16]; // 臨接表 int cat[16][16]; /*定義方向數(shù)組*/ int gotox[4] = {0, 0, 1, -1}; int gotoy[4] = {1, -1, 0, 0};void dfs(int a, int b, int ans) {cat[a][b] = 1;if (ans >= MIN) // 步數(shù)比已經(jīng)找出的最小的 步數(shù)MIN 還有要大return;if (ans < MIN && gra[a][b] == 'Y') // 步數(shù)比最小的已經(jīng)找出的 步數(shù)MIN 還要小且已經(jīng)找到Y(jié){ // 如果找不到Y(jié) MIN 仍然是INFMIN = ans;return;}for (int i = 0; i < 4; i++){int x = a + gotox[i]; // 遍歷四個方向的鄰點int y = b + gotoy[i];if (x >= 0 && x < n && y >= 0 && y < m && !cat[x][y] && gra[x][y] != '#'){cat[x][y] = 1;dfs(x, y, ans + 1); // 符合條件 搜索 步數(shù)+1 遞歸搜下一點cat[x][y] = 0; // 遞歸完無果 把訪問過的點標記為未訪問}} } int main() {ios::sync_with_stdio(false);while (cin >> n >> m){int a, b;memset(cat, 0, sizeof(cat));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> gra[i][j];if (gra[i][j] == 'X'){a = i;b = j;}}}MIN = INF;ans = 0;dfs(a, b, ans);if (MIN != INF)cout << MIN << endl;elsecout << "-1" << endl;}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/iQXQZX/p/10258745.html
總結(jié)
以上是生活随笔為你收集整理的SDUTOJ2779_找朋友(BFS | | DFS双解法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask 自定义过滤器多个参数传入
- 下一篇: CCF关于对NOIP2018复赛违规处罚