1. 程式人生 > 實用技巧 >Oracle報錯28002客戶端登入提示密碼還有5天過期

Oracle報錯28002客戶端登入提示密碼還有5天過期

題目如下:

聖誕節要到了,坤神和瑞瑞這對基佬想一起去召喚師大峽谷開開車。百度地圖一下,發現周圍的召喚師大峽谷還不少,這對基佬糾結著,該去哪一個。。。坤神:我要去左邊的這個(因為離自己比較近 哈哈~)。。瑞瑞:我要去右邊的這個(因為離自己比較近 嘿嘿~) ........這對基佬鬧矛盾了,開車有危險了! 為了不讓他們去召喚師大峽谷坑人,riot決定讓他們去X召喚師大峽谷,保證他倆所走的路程和最短。每走一個點需要花費11分鐘,輸出他們一共花費多少時間(最短時間噢)


Input

多組測試資料

每組資料,開始一行n,m (2<=n,m<=200)

接下來是個n x m的矩陣

'Y' 表示坤神所在的初始位置

'M' 表示瑞瑞所在的初始位置

'#' 該點禁止通行

'.' 該點可通行

'@' 召喚師大峽谷


Output

每組測試資料,輸出坤神和瑞瑞到達同一個召喚師大峽谷所花費的最短時間。

Sample Input

4 4

Y.#@

....

.#..

@..M

4 4

Y.#@

....

.#..

@#.M

5 5

Y..@.

.#...

.#...

@..M.

#...#


Sample Output

66

88

66


Hint

對於第一組樣例,坤神和瑞瑞去矩陣(4,1) 這個召喚師大峽谷,耗費的時間為 3 * 11 + 3 * 11 = 66, 去矩陣(1,4)這個召喚師大峽谷,耗費的時間為 5 * 11 + 3 * 11 = 88 。所以,最終答案:66。


解題思路:

這道題是一道雙bfs的題目,我們需要先求得以Y為起點,到達所有終點時的最短距離。這樣的話,就得需要執行一次bfs。並且,我們還需要求得以M為起點,到達所有終點時的最短距離。一共需要兩次bfs。並且,在這道題中終點不止兩個,可能會有多個。還存在Y和M都到達不了的終點。最後,我們還需要將Y和M所求得的多個終點的最短距離相加,並從中取得最小距離的終點。不懂的話,就閱讀一下程式碼吧~


注意,這道題中由於圖可以到達(200,200)。所以遍歷的狀態非常多,我們需要用scanf/printf進行輸入輸出,而不要用cin/cout。不然的話可能會TLS!


並且,這道題你也可以單獨寫兩個以Y為起點的bfs和以M為起點的bfs。但是,這麼寫的話實現起來比較麻煩,因此不推薦這麼寫。


程式碼如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct Node
{
	int x, y;
};
struct Node Y, M;
struct Node New;                                      //定義一個移動之後的點new
queue<struct Node> Q;
void bfs(struct Node start);
void init();
bool vis[202][202];         //訪問陣列
const int INF = 0x3f3f3f3f; //定義極大值
int End[202][202];          //儲存每個終點的最終步數(終點的最終步數 = 以Y為起點的bfs後終點步數 + 以M為起點的bfs後終點步數)
int status[202][202];       //儲存每個點的步數
char Graph[202][202];       //圖
int x[4] = { 1,0,-1,0 };    //方向陣列(代表四個方向)
int y[4] = { 0,1,0,-1 };
int n, m;

void bfs(struct Node start)
{
	init();
	int movex, movey;              //代表移動之後的座標
	int i;
	struct Node temp;              //代表當前正在遍歷的頂點
	Q.push(start);                 //起點入隊
	vis[start.x][start.y] = true;  //代表起點已經訪問過
	status[start.x][start.y] = 0;  //起點距離起點的位置為0
	while (!Q.empty())
	{
		temp = Q.front();
		Q.pop();
		if (Graph[temp.x][temp.y] == '@')                    //如果遍歷到了終點
		{
			End[temp.x][temp.y] += status[temp.x][temp.y];   //將終點所需的距離進行累加( 其中 status[temp.x][temp.y]代表當前起點進行bfs時,終點的距離)
		}
		for (i = 0; i < 4; i++)
		{
			movex = temp.x + x[i];
			movey = temp.y + y[i];
			if (movex >= 0 && movex < n && movey >= 0 && movey < m && Graph[movex][movey] != '#' && vis[movex][movey] == false)
			{
				vis[movex][movey] = true;                             //代表這個點已經訪問
				status[movex][movey] = status[temp.x][temp.y] + 11;   //進行距離的計算
				New.x = movex;                                        //移動之後需更改x座標
				New.y = movey;                                        //移動之後需更改y座標
				Q.push(New);                                          //將移動後的座標進行入隊
			}
		}

	}
}

void init()
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			vis[i][j] = false;
			status[i][j] = -1;
		}
	}
}

int main()
{
	int i, j;
	int time = INF;
	while (scanf("%d %d", &n, &m) != EOF)
	{
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
			{
				End[i][j] = 0;                    //將終點的最終距離都初始化為0
			}
		}
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
			{
				scanf(" %c", &Graph[i][j]);
				if (Graph[i][j] == 'Y')
				{
					Y.x = i;
					Y.y = j;
				}
				if (Graph[i][j] == 'M')
				{
					M.x = i;
					M.y = j;
				}
			}
		}
		bfs(Y);                                     //以Y為起點進行bfs
		bfs(M);                                     //以M為起點進行bfs
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
			{
				if (Graph[i][j] == '@' && vis[i][j] == true)   //如果此點為終點,且終點是訪問過的
				{
					time = min(time, End[i][j]);      //將所有到的終點進行計算,從到的終點中得出最小時間的終點
				}
			}
		}
		printf("%d\n", time);
		time = INF;
	}
}