openjudge 1.12 6 寻宝

OpenJudge - 06:寻宝


解题思路:

1.由题可得,一共有n,每层有m个房间,房间是从0-m-1来编号的,每个房间里面有一个指示牌数字,代表要走这个数字的楼梯

2.可以想到利用二维数组来存储每层的房间信息,因为每个房间有两个数字分别代表是否有楼梯和指示牌数字,所以利用结构体来存储,bool x;int num;

3.观察m和n的范围,并且num的数值,因为数值num可能很大,而每层的房间又不会超过100个,所以他在每层中走的时候,肯定会有周期性的问题,在输入每层的房间信息时,就将该层的有楼梯的房间数量计算出来,存储到数组shuliang中

4.然后每层开始遍历,遍历每层前,计数器sum用来记录走过了多少楼梯,temp用来标注此时的房间号,ans为累加该房间的指示牌数字,因为数字可能很大,结果对20123取余,所以在运算过程就取余ans=(ans+a[i][temp].num)%20123,接着计算需要遍历的房间res=(a[i][temp].num-1)%shuliang[i]+1,然后判断该房间是否有楼梯,如果有sum++,判断sum是否等于res,如果相等,结束while循环,开始下一层,如果不等,,房间号temp++,判断temp是否为m,如果是回到0,形成环状

5.最后输出ans


#include<bits/stdc++.h>
using namespace std;

struct node{
	bool x;//表示是否有楼梯
	int num;//表示指示牌的数字 
}a[10005][105];

int shuliang[10005];

int main()
{
	int n,m,temp,ans=0;
	cin>>n>>m;

	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m-1;j++)
		{
			cin>>a[i][j].x>>a[i][j].num;
			shuliang[i]+=a[i][j].x;
		}
	}//将每层的m个房间的信息输入到结构体数组中

	cin>>temp;

	for(int i=1;i<=n;i++)
	{
		int sum=0;//每层初始化计数器为0
		ans=(ans+a[i][temp].num)%20123;//加上此时房间的指示数字 
		int res=(a[i][temp].num-1)%shuliang[i]+1;//形成周期,因为指示数字可能很大,但是房间比较少 
		while(1)
		{
			if(a[i][temp].x==1)//判断该房间如果有楼梯则计数器累加 
			{
				sum++;
				if(sum==res)//如果计数器等于所走的有楼梯的房间数
				{
					break;//结束循环 
				} 
			} 

			temp++;//书签移动,去下一个房间 
			if(temp==m)//如果书签移动到m号房间,则变为0号房间 
			temp=0;//形成环状 
		}
	}

	cout<<ans;
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值