1360G 1900
题意:对一个长度为m高度为n的全为零二维数组进行操作也就是ar[n][m], 令其每列横行1的个数为a,每排纵行的1的个数为b,
如下所示、
该数组的a=2,b=1,问你是否存在这么一个ar[n][m]数组使得其满足a和b的要求,如果存在打印“YES”且打印出这个数组,若不存在,则打印“NO”。
思路:首先判断这个数组是否存在,这个是相对来说比较简单的,可以知道这个数组的和也就是所有的横行的1相加的和或者说所有纵行的1相加的和,SUM = an=bm,如果不满足这个条件肯定是不存在这个二维数组的,但如果相等,那么就存在。
对于存在的数组中‘1’的排列,可以对于每行的‘1’的排列进行平移a个位置,举个例子
对于3 6 2 1的数组可以
1 1 0 0 0 0
0 0 1 1 0 0
0 0 0 0 1 1
这样排列,如果排列超出了这个数组的长度限制则对m取余也就是每行的格数。最后不难得到答案
具体实现看代码
int main(){
IOS;
int t;
cin>>t;
while(t--){
int n, m, a, b;
cin>>n>>m>>a>>b;
int ar[100][100];
memset(ar, 0, sizeof(ar));
if(n*a!=b*m){
cout<<"NO"<<endl;
continue;
}else cout<<"YES"<<endl;
int x = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < a; j++){
ar[i][x] = 1;
x++;
x = x%m;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout<<ar[i][j];
}
cout<<endl;
}
}
return 0;
}