ZZULIOJ 2473: 迷宫(模拟)

24 篇文章 0 订阅

题目描述
X星球没有监狱,对于哪些犯罪的人。就是把他们放入迷宫里慢慢惩罚他们。
你作为一个迷宫构建师。你的任务就是生成符合要求的迷宫。
对于一个大小为nm的迷宫,第一行房间编号从左往右为1~m, 第二行
房间的编号为m+1~2
m, 以此类推。共有n*m个房间。
我们希望有的房间能到达另外的房间。所以对生成的迷宫有q个要求
对于每一个要求:k ch。k代表房间编号,ch代表开口的方向。一共有两种取值:
➀W:向下开口 ➁R:向右开口。
目数据保证:➀迷宫的四周墙壁没有开口。 ➁要求可能重复
输入

第一行输入三个整数:n, m, q。 (1<=n<=50, 1<=m<=50, 0=<q<=2nm-n-m)

接下来的q行,每一行输入一个k, ch (1<=k<=n*m, ch={‘W’, ‘R’})
输出
生成符合要求的迷宫
样例输入
4 6 6
16 W
11 R
11 R
16 W
1 R
22 R
样例输出

+---+---+---+---+---+---+
|       |   |   |   |   |
+---+---+---+---+---+---+
|   |   |   |   |       |
+---+---+---+---+---+---+
|   |   |   |   |   |   |
+---+---+---+   +---+---+
|   |   |   |       |   |
+---+---+---+---+---+---+

只有向右和向下的开口,所以只需要找到向右和向下的位置关系,然后使开头打印空格就可以了

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, m, q, k, x, y;
	char ch;
	cin >> n >> m >> q;
	string a[51], b[52];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			b[i] += "+---";
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			a[i] += "|   ";
	while (q--){
		cin >> k >> ch;
		y = (k - 1) / m + 1;       //y为纵坐标,避免恰好除整,所以减个1处以每行的房间数
		x = (k - (y - 1)*m) * 4;   //x为横坐标,减去已经够行的房间数*4,就是对应房间的横坐标
		if (ch == 'R')a[y][x] = ' ';    //如果是向右,直接把向右的开头出变成空格
		if (ch == 'W'){               //如果是向下,把对应位置的减号变成空格
			for (int i = x - 1; i >= x - 3; i--)
				b[y][i] = ' ';
		}
	}
	for (int i = 1; i <= m; i++)
		cout << "+---"; cout << "+" << endl;
	for (int i = 1; i <= n; i++){
		for (int j = 0; j <= m * 4 - 1; j++)
			cout << a[i][j];
		cout << "|" << endl;         //最右边的丨
		for (int j = 0; j <= m * 4 - 1; j++)
			cout << b[i][j];
		cout << "+" << endl;      //最右边的+
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值