NOIP2017普及組 棋盤

2021-08-10 19:07:19 字數 1671 閱讀 8044

noip2017

有乙個m × m的棋盤,棋盤上每乙個格仔可能是紅色、黃色或沒有任何顏色的。你現在

要從棋盤的最左上角走到棋盤的最右下角。

任何乙個時刻,你所站在的位置必須是有顏色的(不能是無色的),你只能向上、下、

左、右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你

不需要花費金幣;如果不同,則你需要花費1 個金幣。

另外,你可以花費2 個金幣施展魔法讓下乙個無色格仔暫時變為你指定的顏色。但這個

魔法不能連續使用,而且這個魔法的持續時間很短,也就是說,如果你使用了這個魔法,走

到了這個暫時有顏色的格仔上,你就不能繼續使用魔法;只有當你離開這個位置,走到乙個

本來就有顏色的格仔上的時候,你才能繼續使用這個魔法,而當你離開了這個位置(施展魔

法使得變為有顏色的格仔)時,這個格仔恢復為無色。

現在你要從棋盤的最左上角,走到棋盤的最右下角,求花費的最少金幣是多少?

第一行包含兩個正整數m,n,以乙個空格分開,分別代表棋盤的大小,棋盤上

有顏色的格仔的數量。

接下來的 n 行,每行三個正整數x,y,c,分別表示座標為(x,y)的格仔有顏色c。

其中c=1 代表黃色,c=0 代表紅色。相鄰兩個數之間用乙個空格隔開。棋盤左上角的座標

為(1, 1),右下角的座標為(m, m)。

棋盤上其餘的格仔都是無色。保證棋盤的左上角,也就是(1,1)一定是有顏色的。

輸出一行,乙個整數,表示花費的金幣的最小值,如果無法到達,輸出-1。

(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)

5 7

1 1 0

1 2 0

2 2 1

3 3 1

3 4 0

4 4 1

5 5 0

8

實話說,考試的時候就沒想到得全分,於是就直接開始深搜加騙分

#include#include#include#include#include#includeusing namespace std;

int m,n,f[105][105],x,y,ans=int_max,an,r1[5]=,r2[5]=;

bool ml=1,f1[105][105],f2,g1[105],g2[105];

void dfs()

,r2[5]=,ans[105][105];

bool ml=1,f1[105][105],f2,g1[105],g2[105];

void dfs(int an)

else

}if(f[x][y]!=f[x-r1[i]][y-r2[i]]) an1++;

if(!ml&&!ff1) ml=1,ff2=1;

f1[x][y]=0;

dfs(an+an1);

if(ff1)

if(ff2) ml=0;

f1[x][y]=1;

x-=r1[i],y-=r2[i];}}

}int main()

for(int i=1;i<=n;i++)

x=y=1;

dfs(0);

printf("%d",ans[m][m]);

return 0;

}

NOIP2017普及組 棋盤

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

noip 2017 普及組 T3 棋盤

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

NOIP 2017 普及組 初賽

noip 2017 普及組 初賽 頭一次,短時間內把同年的 提高組 初賽 普及組 初賽 題目做了一遍。感覺是,普及組的題目相比提高組,真是弱爆了,完全不在乙個層次,題目做下來真的很菜。一 單項選擇題 1.補碼計算原碼,保留首位的符號位不變,剩下的位取反加1.補碼 10101011 補碼取反 1101...