洛谷 P3956 棋盤 搜尋 1 5

2021-08-22 10:36:02 字數 2719 閱讀 9841

有乙個m×m 的棋盤,棋盤上每乙個格仔可能是紅色、黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。

任何乙個時刻,你所站在的位置必須是有顏色的(不能是無色的), 你只能向上、 下、左、 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣;如果不同,則你需要花費1個金幣。

另外, 你可以花費 2 個金幣施展魔法讓下乙個無色格仔暫時變為你指定的顏色。但這個魔法不能連續使用, 而且這個魔法的持續時間很短,也就是說,如果你使用了這個魔法,走到了這個暫時有顏色的格仔上,你就不能繼續使用魔法; 只有當你離開這個位置,走到乙個本來就有顏色的格仔上的時候,你才能繼續使用這個魔法,而當你離開了這個位置(施展魔法使得變為有顏色的格仔)時,這個格仔恢復為無色。

現在你要從棋盤的最左上角,走到棋盤的最右下角,求花費的最少金幣是多少?

輸入格式:

第一行包含兩個正整數 m,n ,以乙個空格分開,分別代表棋盤的大小,棋盤上有顏色的格仔的數量。

接下來的 n 行,每行三個正整數 x, y,c  分別表示座標為 (x,y) 的格仔有顏色c 。

其中 c=1 代表黃色,c=0 代表紅色。 相鄰兩個數之間用乙個空格隔開。 棋盤左上角的座標為(1,1) ,右下角的座標為 (m,m) 。

棋盤上其餘的格仔都是無色。保證棋盤的左上角,也就是 (1,1) 一定是有顏色的。

輸出格式:

乙個整數,表示花費的金幣的最小值,如果無法到達,輸出−1 。

輸入樣例#1

5 7

1 1 0

1 2 0

2 2 1

3 3 1

3 4 0

4 4 1

5 5 0

輸出樣例#1

8
輸入樣例#2

5 5

1 1 0

1 2 0

2 2 1

3 3 1

5 5 0

輸出樣例#2

從 (1,1) 開始,走到 (1,2) 不花費金幣

從 (1,2) 向下走到 (2,2) 花費 1 枚金幣

從 (2,2) 施展魔法,將 (2,3) 變為黃色,花費 2 枚金幣

從 (2,2) 走到 (2,3) 不花費金幣

從 (2,3) 走到 (3,3) 不花費金幣

從 (3,3) 走到 (3,4) 花費 1 枚金幣

從 (3,4) 走到 (4,4) 花費 1 枚金幣

從 (4,4) 施展魔法,將(4,5) 變為黃色,花費 2 枚金幣,

從(4,4) 走到(4,5) 不花費金幣

從(4,5)走到 (5,5) 花費 1 枚金幣

共花費 8 枚金幣。

從(1,1) 走到(1,2) ,不花費金幣

從(1,2) 走到(2,2) ,花費 1 金幣

施展魔法將 ( 2, 3)(2,3) 變為黃色,並從 ( 2, 2)(2,2) 走到(2,3) 花費 2 金幣

從(2,3) 走到(3,3) 不花費金幣

從(3,3) 只能施展魔法到達(3,2),(2,3),(3,4),(4,3)

而從以上四點均無法到達(5,5) ,故無法到達終點,輸出−1

對於 30% 的資料, 1 ≤ m ≤ 5,1≤n≤10

對於 60% 的資料, 1 ≤ m ≤ 20,1≤n≤20

對於 100% 的資料, 1 ≤ m ≤ 100,1≤n≤1000

這道題確實可以用bfs來做。由於本人過弱,所以就寫出來乙個dfs的**。

首先純dfs暴力+回溯絕對會超時,那可怕的資料,最多也就拿個60分很吊了。所以不能回溯,順便剪枝,絕對不會超時了。

#include #include #include using namespace std;

int a[101][101],b[101][101];//a陣列模擬座標,b陣列儲存方案,尋找最優方案

int tox[5]=;//4個方向

int toy[5]=;

int m,n,minx=0x7fffffff;

inline void dfs(int x,int y,int flag,int s)//搜尋,從第x,y個座標開始

if(s>=b[x][y])//如果該方案沒有之前的最優方案好

else//否則

b[x][y]=s;//更改最優方案

if(x==n&&y==n)//如果到達終點

else//黃色

}memset(b,0x7f,sizeof(b));//給b陣列賦很大的值,方便後面判斷最優方案

dfs(1,1,1,0);//開始深搜,第1、2個引數表示座標(當前),第3個引數表示能否使用魔法,第4個引數表示所用金幣數

if(minx==0x7fffffff)//沒有方案

else

return 0;

}

洛谷 P3956 棋盤

js省裡冬令營夏令營講深搜都講到了 今天上午測試的題,15分,因為剪枝沒剪乾淨,少了個等於號,於是本來能拿到的分也沒拿到,唉 主要思想dfs 剪枝 include using namespace std int m,n 依照題目 int a 107 107 存顏色 int vis 107 107 存...

洛谷 P3956 棋盤

找了找發現這週做的竟然都是水題,那麼就把不知道多久以前的一道水題發出來吧。p3956 棋盤 有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。...

洛谷 P3956 棋盤(DFS)

有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣 如果不同,則你需...