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
5 5
1 1 1 -1 -1
1 1 1 -1 -1
-1 -1 -1 1 1
1 1 1 1 -1
-1 -1 -1 -1 -1
输出样例1
1
-1
-1
-1
-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记得点赞,有问题放评论区