棋盤(dfs 剪枝)

2021-09-20 21:13:35 字數 2252 閱讀 1664

題目描述

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

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

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

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

輸入輸出格式

輸入格式:

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

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

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

棋盤上其餘的格仔都是無色。保證棋盤的左上角,也就是(1,1)(1,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:

輸入樣例#2:

5 51 1 0

1 2 0

2 2 1

3 3 1

5 5 0

輸出樣例#2:

這道題目的一句話題意是:

讓你從(1,1)(1,1)走到(m,m)(m,m),要求路上的花費代價最少.

如果你從a走到b,那麼走一步的代價有三種:

1. 若方格a的顏色等於方格b的顏色,那麼花費代價為0

2. 若方格a的顏色不同於方格b的顏色,那麼花費代價為1.

3. 若方格b的顏色為無色,那麼相當於使用一次魔法,且花費的代價為2,並且下一步不可以使用魔法.

需要考慮的情況有:

1.上一次使用了魔法,那麼這一次不能使用魔法

2.上一次使用了魔法,判斷上乙個點是不是和當前點顏色一致

3.顏色相同則不需要花費代價,否則花費1點代價

4.拓展的點是無顏色,那麼我們必須使用魔法,並且花費兩點代價

另外還必須要剪枝

#includeusing namespace std;

const int maxn = 1005;

int dis[maxn][maxn],vis[maxn][maxn],mp[maxn][maxn];

int ans=1e9,n,m;

int mov[5][2]=,,,};

bool check(int x,int y)

void dfs(int x,int y,int now,int tmp)

else if(now==1||now==2)

else

dfs(fx,fy,now+2,tmp+2);//使用了魔法,代價+2

//這個地方因為染完色的地方走完下一步就又變成空白的了,所以是 now + 2

} vis[fx][fy]=0;

} }int main()

vis[1][1]=1;

dfs(1,1,mp[1][1],0);

if(ans==1e9)

printf("-1\n");

else

printf("%d\n",ans);

return 0;

}

搜尋剪枝DFS

tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...

DFS搜尋 剪枝

hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...

DFS及其剪枝

深度優先搜尋,是從初始狀態起,利用一定的規則生成搜尋樹,尋找下一層任乙個結點,檢查是否出現目標狀態,若未出現,以此狀態利用規則生成再下一層任乙個結點,再檢查,重複過程一直到葉節點 即不能再生成新狀態節點 當它仍不是目標狀態時,回溯到上一層結果,取另一可能擴充套件搜尋的分支。採用相同辦法一直進行下去,...