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...