Codevs 2495 水叮噹的舞步

2022-05-03 11:33:16 字數 3412 閱讀 5160

時間限制: 1 s

空間限制: 32000 kb

題目等級 : 鑽石 diamond

題解檢視執行結果

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

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

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

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

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

輸入描述 input description

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

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

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

n=0代表輸入的結束。

輸出描述 output description

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

樣例輸入 sample input

20 0 

0 03

0 1 2

1 1 2

2 2 1

0樣例輸出 sample output03

資料範圍及提示 data size & hint

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

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

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

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

第二組樣例解釋:

0 1 2       1 1 2       2 2 2      1 1 1

1 1 2 --> 1 1 2 --> 2 2 2 --> 1 1 1

2 2 1       2 2 1       2 2 1      1 1 1

分類標籤 tags 點此展開 

啟發式搜尋

迭代搜尋

搜尋感觸:(不敢說是思路)

網上說此題最後乙個點卡常數,

,dfs肯定跑不快,這不明顯坑爹嗎!~

網上有大神和我寫的差不多的,各種優化,最關鍵人家是用bfs搜過的。

dfs改bfs,bfs不知道哪寫錯了。

所有答案都wa了。(bfs部分引去了)

挑了1個多小時,實在調不出來了。放棄了。。。

~~~~(>_

90分**:

#include#include

#include

#include

using

namespace

std;

inline

const

intread()

const

int dx=;

const

int dy=;

const

int n=9

;int

n,g[n][n],a[n][n];

bool

flag,vis[n][n],mark[n];

inline

void calc(int &c)}}

}void go(int x,int y,int c,int

r) }

}void get_round(int x,int y,int c,int

round)

}}/*

#define xx first

#define yy second

pairq[800000];

void go(int x,int y,int c,int r)}}

}void get_round(int x,int y,int c,int round)

else if(!round[a[nx][ny]]) round[a[nx][ny]]=1;}}

}}*/

void dfs(int now,int

sum)

if(now+c-1>sum) return

; memset(vis,

0,sizeof

vis);

int round[n]=;

get_round(

1,1,a[1][1

],round);

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

} int

main()

}int ans=0

;

for(int k=0;k<=16;k++)

}printf(

"%d\n

",ans);

}return0;

}

ac的艱辛:

題解:

主要是優化了我的「大水漫灌」函式:(基本上都改了)

我們可以發現,每次尋找左上角的格仔所在的聯通塊耗費的時間常數巨大。因此我們在這裡尋求突破。

我們引入乙個n*n的v陣列。左上角的格仔所在的聯通塊裡的格仔標記為1。左上角聯通塊周圍一圈格仔標記為2,其它格仔標記為0。如果某次選擇了顏色c,我們只需要找出標記為2並且顏色為c的格仔,向四周擴充套件,並相應地修改v標記,就可以不斷擴大標記為1的區域,最終如果所有格仔標記都是1,那麼顯然找到了答案。(參考黃學長的部落格)

ac**:

#include#include

#include

#include

const

int dx=;

const

int dy=;

const

int n=9

;int

n,mp[n][n];

intmark[n][n];

bool

ans,vis[n];

ints;

inline

intget

() }

}returnt;}

void dfs(int x,int y,int

val)

}inline

int fill(int

x) }

}returnt;}

void search(intk)}

intmain()

}dfs(

1,1,mp[1][1

]);

for(s=0;;s++)}}

return0;

}

codevs2495 水叮噹的舞步

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

水叮噹的舞步 深搜

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

JZOJ 3422 水叮噹的舞步

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