NOIP2017普及組 棋盤

2021-08-10 21:02:01 字數 2886 閱讀 8721

棋盤

有乙個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...