挡板与小球(含AC代码)

hh,就一个模拟

#C、 挡板与小球

题目描述

Mas有 n 颗小球 , 同时有一个 m×n的网格 a表示一个有挡板的箱子

箱子的顶部和底部都是开着的 , Mas 可以选择将小球从箱子顶部放入

箱中每个方格都有一个横跨对角线的挡板 , 挡板可将小球导向某个方向

对于箱子的第 ii行第 jj列的挡板用 ai,j 描述

  • ai,j=1 时表示挡板从左上到右下

  • ai,j=−1时表示挡板跨从右上到左下

现在 Mas 在箱子每一列的顶端都放入一颗小球

每颗小球都可能 卡在箱中 或 从底部掉出

当小球在箱中无法下落 , 则认为被卡住

输入格式

第一行输入两个正整数 m,n

接下来 m行 n列 , 输入 ai,j

输出格式

输出 n 行 , 每行一个整数

其中 第 i行表示第 i个小球最终落在的列号

从 0 开始编号

如果被卡组输出 −1

输入样例1

  1. 5 5
  2. 1 1 1 -1 -1
  3. 1 1 1 -1 -1
  4. -1 -1 -1 1 1
  5. 1 1 1 1 -1
  6. -1 -1 -1 -1 -1

输出样例1

 
  1. 1
  2. -1
  3. -1
  4. -1
  5. -1

模拟小球掉落

时间复杂度O(N*M)

是完全可以在(对于全部的数据 1≤n≤m≤200)里完成的

好像是全网首发(AC)。。。

上代码!!!

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[206][206],ii=0,jj=0,f=1;
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++) cin>>a[i][j];
	for(int i=0;i<m;i++)
	{
		ii=0;
		jj=i;
		f=1;
		while(f)
		{
			if(ii==n){
				cout<<jj<<endl;
				f=0;
				continue;
			}
			if(a[ii][jj]==1)
			{
				if(a[ii][jj+1]==1&&ii!=n&&jj!=m) 
				{
					ii++;
					jj++;
				}
				else{
					cout<<"-1"<<endl;
					f=0;
					continue;
				}
			}
			else{
				if(a[ii][jj-1]==-1&&ii!=n&&jj<=m&&jj>0){
					ii++;
					jj--;
				}
				else {
					cout<<"-1"<<endl;
					f=0;
					continue;
				}
			}
			//cout<<ii<<" "<<jj<<endl;
		}
	}
	return 0;
} 

ok记得点赞,有问题放评论区

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值