2017年填空(难)

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种颜色,所以把家里的二阶魔方重新涂了颜色。前面橙色,右面绿色,上面黄色,左面绿色,下面橙色,后面黄色。请你计算一下,这样的魔方被打乱后,一共有多少种不同的状态。
如果两个状态经过魔方的整体旋转后,各个面的颜色都一致,则认为是同一状态。
全排列问题,关键怎么扭动魔方及去重还要靠大佬。。。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值