27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)

题目描述

X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。

X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!

开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。
迷宫地图如下:

UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR

请你计算一下,最后,有多少玩家会走出迷宫?
而不是在里边兜圈子。


分析与思考

第一眼看上去以为是搜索, 读完题发现是一道暴力枚举题

思路:
先思考一下,若迷宫规模为n,则某点在迷宫中最多只能走 n*n步(蛇形), 因此, 在对每个点遍历时,可以用num记录步数,当num超过n*n+5后,表明这条路没办法走出去, 反之,如果在遍历期间ij越界,则说明可以走出去。 最后统计总数即可。

改进:

  1. 可以设置一个与迷宫规模等大的二维int数组, 全部置0, 如果某点能走通, 则置1, 这样,在遍历每个点前,先判断对应的int数组是否等于1, 若等于1, 则直接结束此次循环, 会大大提高效率。
  2. 使用define定义数组的规模, 可以在测试时方便的调节数组大小。

代码展示

#include<bits/stdc++.h>
#define N 10
using namespace std;
char a[N][N];			//记录迷宫 
int b[N][N];			//如果该点可以走通,则置1。 
int main() {
    
    
	for(int i = 0; i < N; i++)  cin>>a[i]; 	//输入迷宫
	 
	memset(b, 0, sizeof(b));
	int sum1 = 0;		//记录能走出去的次数 
	
	for(int i = 0; i < N; i++) 	//遍历 
		for(int j = 0; j < N; j++) {
    
    
			int sum = 0;
			int i1=i, j1=j;		//代替i,j进行值的变化 
			while(sum < N*N+10) {
    
    	 
				if(b[i1][j1]==1) break;	//如果走到的这个点 b[i][j]=1,则代表能走出去 
				sum++;
				if(a[i1][j1] == 'U') i1--;
				else if(a[i1][j1] == 'D') i1++;
				else if(a[i1][j1] == 'L') j1--;
				else if(a[i1][j1] == 'R') j1++;
				
				if(i1<0 || i1>=N || j1<0 || j1>=N)  break;
			}
			if(sum != N*N+10) {
    
     sum1++; b[i][j]=1; } 	//如果sum遍历到头,则说明走不出去 
		}
	cout << sum1 << endl;
return 0; } 

这世界就是,一些人总在昼夜不停的努力,而另外一些人,起床就发现世界已经变了。 加油,陌生人!

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/108822570