水叮噹的舞步 深搜

2022-05-11 02:15:05 字數 3058 閱讀 2125

背景background

水叮噹得到了一塊五顏六色的格仔形地毯作為生日禮物,更加特別的是,地毯上格仔的顏色還能隨著踩踏而改變。

為了討好她的偶像虹貓,水叮噹決定在地毯上跳一支輕盈的舞來賣萌~~~

描述description

地毯上的格仔有n行n列,每個格仔用乙個0~5之間的數字代表它的顏色。

水叮噹可以隨意選擇乙個0~5之間的顏色,然後輕輕地跳動一步,左上角的格仔所在的聯通塊裡的所有格仔就會變成她選擇的那種顏色。這裡連通定義為:兩個格仔有公共邊,並且顏色相同。

由於水叮噹是施展輕功來跳舞的,為了不消耗過多的真氣,她想知道最少要多少步才能把所有格仔的顏色變成一樣的。

輸入格式inputformat

每個測試點包含多組資料。

每組資料的第一行是乙個整數n,表示地攤上的格仔有n行n列。

接下來乙個n*n的矩陣,矩陣中的每個數都在0~5之間,描述了每個格仔的顏色。

n=0代表輸入的結束。

輸出格式outputformat

對於每組資料,輸出乙個整數,表示最少步數。

樣例輸入sampleinput

20 0

0 03

0 1 2

1 1 2

2 2 1

0樣例輸出sampleoutput03

資料範圍和注釋hint

對於30%的資料,n<=5

對於50%的資料,n<=6

對於70%的資料,n<=7

對於100%的資料,n<=8,每個測試點不多於20組資料。

這題首先告訴我們,一定要審題,仔細審題,用心審題。

一開始看這道題,以為好難,要怎麼怎麼複雜地廣搜。然後經過楊之典大觸的指出後,我才知道其實每次只是動左上角那個聯通塊,於是問題就清晰了。

我們經過一定的思考,這題廣搜其實沒有深搜好用,於是我們就用深搜來解決這道題。

那麼用深搜就一定要有一定的剪枝,所以我們來看看怎麼剪枝。

首先第乙個剪枝很明顯,如果在ans步內已經搜到過目標,那麼之後搜尋的深度肯定在這個範圍之內。

然後是第二個剪枝。假設我們現在圖中有a中顏色,現在是b步,已經在ans步內搜到過答案,那麼如果a+b>ans的話也沒必要往下搜了,因為每次最多改變一種顏色。

第三個剪枝,假設我們左上角聯通塊周圍的顏色是2,4,那麼我們這時還要不要把左上角的聯通塊變成五個顏色往下搜呢?顯然,我們只要把左上角的聯通塊變成2或4再往下搜,

變成其他顏色顯然不是最優的。

第四個剪枝,是建設在第三個剪枝之上的,假設我們左上角的聯通塊周圍的顏色是2,4,而且2有4個,4只有2個,那個我們先搜哪個呢?當然是先搜2,。

講了這麼多,感覺好麻煩,其實,真的很麻煩。

**:

#include#include

#include

#include

#include

#define ll long long

#define il inline

#define db double

using

namespace

std;

il int

gi()

while(ch>='

0'&&ch<='9'

)

return x*y;

}il ll gl()

while(ch>='

0'&&ch<='9'

)

return x*y;

}int

n;int

ans;

int map[10][10

];int pre[10][10

];bool v[10][10

];il

bool check()//

檢查是否滿足條件

il void hzr()//

記錄修改前的圖

il void hzrr()//

用來回溯

il int count()//

用來做第二個剪枝的函式

return

sum;

}struct

colc[

10];//

用來記錄聯通塊周圍的顏色種類和數量的結構體

bool

cmp(col a,col b)

bool vis[10][10

];il

void bfs()//

bfs求聯通塊,並且記錄左上角的聯通塊周圍的顏色

; t[

0][0]=1

; t[

0][1]=1

; v[

1][1]=1

; vis[

1][1]=1

;

while(head!=tail)

vis[x][y]=1

; t[tail][

0]=x;

t[tail++][1]=y;

}head++;

}}il

void change(int x)//

將聯通塊變成目標顏色

viod dfs(

intx)

if(x+count()>ans)//

第二個剪枝

return

; hzr();

//為回溯做準備

bfs();//

求出聯通塊,並且記錄聯通塊周圍的顏色種類和數量

sort(c,c+5,cmp);//

按周圍顏色出現的次數排序

for(int i=0;i<=5;i++)

}int

main()

return0;

}

JZOJ 3422 水叮噹的舞步

水叮噹得到了一塊五顏六色的格仔形地毯作為生日禮物,更加特別的是,地毯上格仔的顏色還能隨著踩踏而改變。為了討好她的偶像虹貓,水叮噹決定在地毯上跳一支輕盈的舞來賣萌 地毯上的格仔有n行n列,每個格仔用乙個0 5之間的數字代表它的顏色。水叮噹可以隨意選擇乙個0 5之間的顏色,然後輕輕地跳動一步,地毯左上角...

水叮噹的舞步(迭代搜尋 A 搜尋)

題目描述 水叮噹得到了一塊五顏六色的格仔形地毯作為生日禮物,更加特別的是,地毯上格仔的顏色還能隨著踩踏而改變。為了討好她的偶像虹貓,水叮噹決定在地毯上跳一支輕盈的舞來賣萌 地毯上的格仔有n行n列,每個格仔用乙個0 5之間的數字代表它的顏色。水叮噹可以隨意選擇乙個0 5之間的顏色,然後輕輕地跳動一步,...

BZOJ T3041 水叮噹的舞步

bzoj 3041 水叮噹的舞步 這是道ida 迭代加深 估價剪枝 首先考慮估價函式,一般情況下我們把易於計算的操作次數的下限作為a 的估價函式,易知這道題裡每次有效操作只會向外拓寬乙個顏色層,那麼估價函式就可以確定為剩下未被拓展的顏色層數。這個層數就是答案,這個數的下限就是剩餘未探索的顏色數,道理...