棋盤
有乙個m × m的棋盤,棋盤上每乙個格仔可能是紅色、黃色或沒有任何顏色的。你現在
要從棋盤的最左上角走到棋盤的最右下角。
任何乙個時刻,你所站在的位置必須是有顏色的(不能是無色的),你只能向上、下、
左、右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你
不需要花費金幣;如果不同,則你需要花費1 個金幣。
另外,你可以花費2 個金幣施展魔法讓下乙個無色格仔暫時變為你指定的顏色。但這個
魔法不能連續使用,而且這個魔法的持續時間很短,也就是說,如果你使用了這個魔法,走
到了這個暫時有顏色的格仔上,你就不能繼續使用魔法;只有當你離開這個位置,走到乙個
本來就有顏色的格仔上的時候,你才能繼續使用這個魔法,而當你離開了這個位置(施展魔
法使得變為有顏色的格仔)時,這個格仔恢復為無色。
現在你要從棋盤的最左上角,走到棋盤的最右下角,求花費的最少金幣是多少?
輸入檔名為chess.in。
資料的第一行包含兩個正整數m,n,以乙個空格分開,分別代表棋盤的大小,棋盤上
有顏色的格仔的數量。
接下來的 n 行,每行三個正整數x,y,c,分別表示座標為(x,y)的格仔有顏色c。
其中c=1 代表黃色,c=0 代表紅色。相鄰兩個數之間用乙個空格隔開。棋盤左上角的座標
為(1, 1),右下角的座標為(m, m)。
棋盤上其餘的格仔都是無色。保證棋盤的左上角,也就是(1,1)一定是有顏色的。
輸出檔名為chess.out。
輸出一行,乙個整數,表示花費的金幣的最小值,如果無法到達,輸出-1。
chess.in
5 7
1 1 0
1 2 0
2 2 1
3 3 1
3 4 0
4 4 1
5 5 0
chess.out
8
見選手目錄下的chess/chess1.in 和chess/chess1.ans。
(此處省略一張)
從(1,1)開始,走到(1,2)不花費金幣
從(1,2)向下走到(2,2)花費1 枚金幣
從(2,2)施展魔法,將(2,3)變為黃色,花費2 枚金幣
從(2,2)走到(2,3)不花費金幣
從(2,3)走到(3,3)不花費金幣
從(3,3)走到(3,4)花費1 枚金幣
從(3,4)走到(4,4)花費1 枚金幣
從(4,4)施展魔法,將(4,5)變為黃色,花費2 枚金幣,
從(4,4)走到(4,5)不花費金幣
從(4,5)走到(5,5)花費1 枚金幣
共花費8 枚金幣。
chess.in
5 5
1 1 0
1 2 0
2 2 1
3 3 1
5 5 0
chess.out
-1
見選手目錄下的chess/chess2.in 和chess/chess2.ans。
(此處省略一張)
從(1,1)走到(1,2),不花費金幣
從(1,2)走到(2,2),花費1 金幣
施展魔法將(2,3)變為黃色,並從(2,2)走到(2,3)花費2 金幣
從(2,3)走到(3,3)不花費金幣
從(3,3)只能施展魔法到達(3,2),(2,3),(3,4),(4,3)
而從以上四點均無法到達(5,5),故無法到達終點,輸出-1
見選手目錄下的chess/chess3.in 和chess/chess3.ans。
對於 30%的資料,1 ≤ m ≤ 5, 1 ≤ n ≤ 10。
對於 60%的資料,1 ≤ m ≤ 20, 1 ≤ n ≤ 200。
對於 100%的資料,1 ≤ m ≤ 100, 1 ≤ n ≤ 1,000。
記憶化深搜:an
s[i]
[j] 表示走到(i
,j) 時的最小代價,如果當前深搜到的代價m≥
ans ,直接return,否則更新an
s ,然後繼續遞迴。
另外,使用魔法是不用遞迴兩種顏色,貪心一下:直接變為和這個格仔一樣的顏色。如果變為不一樣的顏色,一定不比變為一樣顏色格仔更優,分幾種情況討論即可得出。
#include
#include
#define maxn 100
int ans[maxn+5][maxn+5];
int color[maxn+5][maxn+5];
int dir[4][2]=,,,};
int n,m;
void dfs(int x,int y,int m,bool f)//f為現在能不能用魔法,m為現在的代價
}else
if(color[tx][ty]==color[x][y]) dfs(tx,ty,m,1);
else dfs(tx,ty,m+1,1);
}}int main()
memset(ans,0x7f,sizeof ans);//初始化極大值
dfs(1,1,0,1);
if(ans[m][m]==0x7f7f7f7f) printf("-1");
else
printf("%d",ans[m][m]);
}
NOIP2017普及組 棋盤
noip2017 有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在 要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你 不需要花費...
noip 2017 普及組 T3 棋盤
有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣 如果不同,則你需...
NOIP 2017 普及組 初賽
noip 2017 普及組 初賽 頭一次,短時間內把同年的 提高組 初賽 普及組 初賽 題目做了一遍。感覺是,普及組的題目相比提高組,真是弱爆了,完全不在乙個層次,題目做下來真的很菜。一 單項選擇題 1.補碼計算原碼,保留首位的符號位不變,剩下的位取反加1.補碼 10101011 補碼取反 1101...