題目:棋盤
思路:搜尋+剪枝。
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 正解是將已經有色的格仔向四個不同的方向搜尋,未染色的就進行染色,之後再搜尋 一定要注意邊界...