2017年省赛A组C++
A、 迷宫 三重循环
X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间, R表示走到右边的房间,
U表示走到上坡方向的房间,D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
最后有多少玩家走出迷宫而不是在里面兜圈子?
31:visit记录走过,以每个点为起点求能否出来
int visit[10][10];
string in[10];
void init(){//visit矩阵初始化
for (int i=0;i<10;i++){
for (int j=0;j<i;j++) visit[i][j]=0,visit[j][i]=0;
visit[i][i]=0;
}
}
int main(){
int cnt=0,x,y;
for (int i=0;i<10;i++) cin>>in[i];
for (int i=0;i<10;i++){
for (int j=0;j<10;j++){
init(); //visit矩阵初始化
x=i,y=j;//走迷宫
while (visit[x][y]==0){//没有兜圈子
visit[x][y]=1;
if (in[x][y]=='L') y=y-1;
else if (in[x][y]=='R') y=y+1;
else if (in[x][y]=='U') x=x-1;
else if (in[x][y]=='D') x=x+1;
if (x<0||x>9||y<0||y>9) break;//走出迷宫
}
if (x<0||x>9||y<0||y>9) cnt+=1;
}
}
cout<<cnt;
return 0;
}
B、跳蚱蜢
有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8,每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列。并且保持空盘的位置不变(也就是1-8换位,2-7换位,。。。)至少要经过多少次跳跃?
20:典型的bfs,初始状态012345678,终止状态087654321。
八数码问题搞定BFS!
#include <queue>
#include <map>
struct node{
string s;
int t;
};
map<string,int> visit;
queue<node> q;
int main(){
string s="012345678";
q.push({s,0});
visit[s]=1;
int t,i;
while(!q.empty()){
//提取当前状态
node now = q.front();
q.pop();
s = now.s;
t = now.t;
if(s=="087654321"){//终止状态
cout<<t<<endl;
break;
}
//找到空盘位置
for(i=0;i<10;i++){
if(s[i]=='0') break;
}
//哪个蚱蜢可跳空盘,都跳下试试
for(int j=i-2;j<=i+2;j++){
int k = (j+9)%9;
if(k!=i){//非空盘
swap(s[i],s[k]);
if (!visit[s]){//走过了
visit[s]=1;
q.push({s,t+1});
}
swap(s[i],s[k]);
}
}
}
return 0;
}
C、魔方状态
二阶魔方就是只有2层的魔方,只由8个小块组成。
小明只喜欢3种颜色,所以把家里的二阶魔方重新涂了颜色。前面橙色,右面绿色,上面黄色,左面绿色,下面橙色,后面黄色。请你计算一下,这样的魔方被打乱后,一共有多少种不同的状态。
如果两个状态经过魔方的整体旋转后,各个面的颜色都一致,则认为是同一状态。
全排列问题,关键怎么扭动魔方及去重还要靠大佬。。。