藍橋杯 2017 C A 題解

2022-08-19 05:57:16 字數 4625 閱讀 5429

x星球的一處迷宮遊樂場建在某個小山坡上。

它是由10x10相互連通的小房間組成的。

房間的地板上寫著乙個很大的字母。

我們假設玩家是面朝上坡的方向站立,則:

l表示走到左邊的房間,

r表示走到右邊的房間,

u表示走到上坡方向的房間,

d表示走到下坡方向的房間。

x星球的居民有點懶,不願意費力思考。

他們更喜歡玩運氣類的遊戲。這個遊戲也是如此!

開始的時候,***把100名玩家放入乙個個小房間內。

玩家一定要按照地上的字母移動。

迷宮地圖如下:

------------

uddluulrul

uurlllrrru

rruurldlrd

rudddduuuu

urudllrruu

durlrldlrl

ullurllrdu

rdlullrddd

uuddududll

ulrdluurrr

------------

請你計算一下,最後,有多少玩家會走出迷宮?

而不是在裡邊兜圈子。

請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多餘的內容。

如果你還沒明白遊戲規則,可以參看乙個簡化的4x4迷宮的解說圖:

cout如圖 p1.png 所示:

有9只盤子,排成1個圓圈。

其中8只盤子內裝著8只蚱蜢,有乙個是空盤。

我們把這些蚱蜢順時針編號為 1~8

每只蚱蜢都可以跳到相鄰的空盤中,

也可以再用點力,越過乙個相鄰的蚱蜢跳到空盤中。

請你計算一下,如果要使得蚱蜢們的隊形改為按照逆時針排列,

並且保持空盤的位置不變(也就是1-8換位,2-7換位,...),至少要經過多少次跳躍?

注意:要求提交的是乙個整數,請不要填寫任何多餘內容或說明文字。

#include#include#include#include//青蛙跳格仔,採用裸廣搜的方法,幾秒可以出答案,但是有時間限制就不行了

//將青蛙跳看作是,圓盤跳動,這樣就只有乙個變數在變化了

//將圓盤看成是0,初始序列用012345678表示,在廣搜的時候用set判一下重

using namespace std;

struct node

};int n = 9;

setvisited;//已經搜尋過的局面 主要為了去重

queueq;//使用者來廣搜的佇列

//四個方向 也就是四個鄰居的新增

void insertq(node no, int i)//node為新的局面,i為移動方式

}int main() else }}

二階魔方就是只有2層的魔方,只由8個小塊組成。

如圖p1.png所示。

小明很淘氣(是真的淘氣!),他只喜歡3種顏色,所有把家裡的二階魔方重新塗了顏色,如下:

前面:橙色

右面:綠色

上面:黃色

左面:綠色

下面:橙色

後面:黃色

請你計算一下,這樣的魔方被打亂後,一共有多少種不同的狀態。

如果兩個狀態經過魔方的整體旋轉後,各個面的顏色都一致,則認為是同一狀態。

請提交表示狀態數的整數,不要填寫任何多餘內容或說明文字。

#include using namespace std;

typedef char st[8][7];

st state[2000000];

setall;

st begin=,,,,,,,};

//st begin=,,,,,,,};

//只有乙個顏色的魔方 ans=1

//st begin=,,,,,,,};

//正常2階魔方狀態 r紅 y黃 b藍 g綠 w白 o橙 k黑(紅對橙,白對黃,藍對綠,顏色相近的相對)這裡白為底 前為紅

//需要將state大小改為4000000

//這個測試用例跑了20分鐘左右 560m記憶體 ans=3674160 與實際二階魔方狀態數相同 見下截圖

int front, tail;

void ucell(char *a)

void rcell(char *a)

void fcell(char *a)

void u(st &s)//頂層順時針旋轉

void uwhole(st &s)//整個魔方從頂部看 順時針轉 用於判重

void f(st &s)//前面一層 順時針轉

void fwhole(st &s)//整個魔方從前面看 順時針轉 用於判重

void r(st &s)//魔方右層順時針轉

void rwhole(st &s)//整個魔方從右邊看 順時針轉 用於判重

string convert(st &s)//魔方狀態二維字元陣列 轉化為string

bool try_to_insert(int tail)//判重

}} }

all.insert(convert(k));

return true;

}int main()

else if(i==1)

else if(i==2)

}front++;

} cout<6x6的方格,沿著格仔的邊線剪開成兩部分。

要求這兩部分的形狀完全相同。

如圖:p1.png, p2.png, p3.png 就是可行的分割法。

試計算:

包括這3種分法在內,一共有多少種不同的分割方法。

注意:旋轉對稱的屬於同一種分割法。

請提交該整數,不要填寫任何多餘的內容或說明文字。

#include using namespace std;

//方向

int dir[4][2], //左

, // 右

, // 上

,// 下

} ;

int vis[7][7]; //一條邊上7個點

int ans ;

void dfs(int x ,int y)

vis[x][y] =1 ; //當前點

vis[6-x][6-y]=1; //對稱點

for(int i=0;i<4;++i)

if(vis[nx][ny]!=1) }

//當前點的四個方向都走完了 可以滾蛋了

vis[x][y] =0 ; //當前點

vis[6-x][6-y]=0; //對稱點

}int main()

if(s[pos]=='x')

if(s[pos]=='|')

if(s[pos]==')')

} m= max(m,tmp);

return m;

}int main()

int main ()

}//得輸入完畢後再判斷 不能阻斷了輸入

if(i!=1 && g!=1)

/*int mi;

int all;

for(int i=0 ; i0 ; --j)

} //27 points

*/ //二分 優化

int ans =0;

int l = 1 ;

int r = 100001;

int middle = (l+r)/2 ;

while(l<=r)else r = middle -1;

} cout<

return 0 ;

}

2017藍橋杯C A 迷宮(DFS)

一 題目 迷宮 x星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。房間的地板上寫著乙個很大的字母。我們假設玩家是面朝上坡的方向站立,則 l表示走到左邊的房間,r表示走到右邊的房間,u表示走到上坡方向的房間,d表示走到下坡方向的房間。x星球的居民有點懶,不願意費力思考。他...

2017藍橋杯A組賽題解析

1.迷宮 x星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。房間的地板上寫著乙個很大的字母。我們假設玩家是面朝上坡的方向站立,則 l表示走到左邊的房間,r表示走到右邊的房間,u表示走到上坡方向的房間,d表示走到下坡方向的房間。x星球的居民有點懶,不願意費力思考。他們更喜...

2017藍橋杯C A 分巧克力 兩種方法

九 題目 分巧克力 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同 例如...