普及組 2017T3 P3956 棋盤

2021-08-30 09:04:30 字數 1022 閱讀 2980

題目:棋盤

思路:搜尋+剪枝。

55分:裸的dfs,傳4個參:橫縱座標,當前的步數,走到當前步是否使用魔法。

60分:加乙個最優性剪枝,判斷當前步數大於等於ans時可直接回溯。

100分:再加乙個最優性剪枝,類似於記憶化。定義狀態f[x][y][t]表示橫縱座標為x,y,顏色為t時的最小步數。當前步數大於等於f[x][y][t]時也可以直接回溯。

注意一定不要瞎用bool型別!把int寫成bool自然溢位不會報錯好難調……錯了幾次了。

**:

#include

using

namespace std;

#define maxn 100

#define read(x) scanf("%d",&x)

const

int m1[5]

=;const

int m2[5]

=;int n,m;

int a[maxn+5]

[maxn+5]

;int ans=

1e9;

bool vis[maxn+5]

[maxn+5]

;int f[maxn+5]

[maxn+5]

[4];

void

dfs(

int x,

int y,

int stp,

bool c)

vis[x]

[y]=

true

;for

(int i=

1;i<=

4;i++

)elseif(

!c)}

vis[x]

[y]=

false;}

intmain()

dfs(1,

1,0,

0);printf

("%d"

,ans==

(1e9)?

-1:ans)

;return0;

}

2017普及組D1T3 洛谷P3956 棋盤

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

noip 2017 普及組 T3 棋盤

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

NOIP2017棋盤(普及T3)

題面傳送門 開始想去dp,但是寫完之後發現不滿足dp的無後效性,真是gg 然後開始著手dfs 記憶化。貌似bfs也能跑?話說我是不是押到題了,之前給四十五中出過一道類似於bfs的題 但感覺複雜度太大,會tle 正解是將已經有色的格仔向四個不同的方向搜尋,未染色的就進行染色,之後再搜尋 一定要注意邊界...