棋盤 DFS 記搜

2021-08-22 17:59:00 字數 1783 閱讀 5928

有乙個n×

n n×n

的棋盤,有2種顏色。每次你可以移到上下左右中的一格,如果這兩個各自顏色相同,那麼就不用花錢,如果顏色不同,將要花一塊錢。這個棋盤上還有一些格仔是沒有顏色的,你不能站在沒顏色的格仔上,但是你可以花兩塊錢用魔法將這個格仔變為任意乙個顏色,但是這個魔法不能連續使用,而你離開使用了魔法的格仔之後,這個格仔又將變回去。求從(1

,1) (1,

1)

走到(n

,n) (n,

n)

的最小花費。df

s dfs

原來可以過。。。

對於乙個點(x

,y) (x,

y)

,我們設它的最小花費為an

s[x]

[y] ans

[x][

y]

,那麼最終答案就是an

s[n]

[n] ans

[n][

n]

。 那麼就可以打乙個五維的df

s dfs

,dfs(x,

y,us

e,k,

c)d fs

(x,y

,use

,k,c

)分別表示這個點的座標為

x x

行y' role="presentation">y

y列,上一次是否使用了魔法,走到這的花費和上乙個格仔的顏色。

那麼又要分4種情況討論:

偽**如下:

if ((!a[xx][yy])&&use) continue;

if ((!a[xx][yy])&&(!use)) dfs(xx,yy,1,k+2,c);

if (a[xx][yy]&&a[xx][yy]==c) dfs(xx,yy,0,k,c);

if (a[xx][yy]&&a[xx][yy]!=c) dfs(xx,yy,0,k+1,a[xx][yy]);

那麼怎麼處理魔法呢?

每次使用完魔法之後,花費要加2,因為為了保證答案最優,肯定是要將下乙個格仔的顏色變成這個各自的顏色,所以使用魔法需要兩塊錢,但是由於顏色一樣就不用再多加一塊錢。

值得注意的是,使用魔法之後並不需要真正的在陣列裡賦值,而是假裝它是有顏色的,

c c

的值不變。如果將陣列

a' role="presentation">a

a也改變了的話,程式將會很麻煩。

最終輸出an

s[n]

[n] ans

[n][

n]

即可。

#include 

#include

#include

using

namespace

std;

const

int dx=;

const

int dy=;

int n,m,a[201][201],***,yyy,color,ans[201][201];

void dfs(int x,int y,int use,int k,int c)

return;

}int main()

memset(ans,0x7f,sizeof(ans));

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

if (ans[n][n]<=1e9) printf("%d\n",ans[n][n]);

else

printf("-1\n");

return

0;}

G 棋盤問題(DFS深搜)

這個題留下了深深的教訓。一周前看的這個題,以為自己搞懂了,然後還寫了csdn,結果還寫的乙個錯的,這次測試狠狠地被打了耳光。自己是真的菜啊。在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小...

POJ 1321 棋盤問題(dfs深搜)

d 棋盤問題 time limit 1000msmemory limit 10000kb64bit io format lld llu submit status practice poj 1321 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺...

使用深度優先搜素(DFS)實現馬踏棋盤

感覺想學會dfs說到底最重要的也就是弄懂遞迴怎麼用 include define x 8 define y 8 int chess x y 棋盤 bool nextxy int x,int y,int count break case1 if x 2 x 1 y 1 y 1 chess x 2 y ...