Codeforces--486B---OR in Matrix思维题
来源:互联网 发布:数据库系统的应用 编辑:程序博客网 时间:2024/06/06 03:11
OR in Matrix
Let's define logical OR as an operation on two logical values (i. e. values that belong to the set{0, 1}) that is equal to 1 if either or both of the logical values is set to1, otherwise it is 0. We can define logicalOR of three or more logical values in the same manner:
where is equal to1 if some ai = 1, otherwise it is equal to0.
Nam has a matrix A consisting of m rows and n columns. The rows are numbered from1 to m, columns are numbered from1 to n. Element at rowi (1 ≤ i ≤ m) and columnj (1 ≤ j ≤ n) is denoted asAij. All elements ofA are either 0 or 1. From matrix A, Nam creates another matrix B of the same size using formula:
.
(Bij isOR of all elements in row i and column j of matrix A)
Nam gives you matrix B and challenges you to guess matrixA. Although Nam is smart, he could probably make a mistake while calculating matrixB, since size of A can be large.
The first line contains two integer m andn (1 ≤ m, n ≤ 100), number of rows and number of columns of matrices respectively.
The next m lines each contain n integers separated by spaces describing rows of matrix B (each element of B is either0 or 1).
In the first line, print "NO" if Nam has made a mistake when calculatingB, otherwise print "YES". If the first line is "YES", then also printm rows consisting of n integers representing matrix A that can produce given matrixB. If there are several solutions print any one.
2 21 00 0
NO
2 31 1 11 1 1
YES1 1 11 1 1
2 30 1 01 1 1
YES0 0 00 1 0矩阵A通过OR运算变成矩阵B,现给出矩阵B,问能不能求出矩阵A,若有多组,输出任意一组矩阵A
OR运算 : A[i][j] 表示矩阵A第i行第j列的所有数中包含1,则B[i][j]就是1,否则就是0
通过B矩阵反求A矩阵
#include<cstdio>#include<cstring>#include<map>#include<cmath>#include<queue>#include<vector>#include<iostream>#include<algorithm>#define PI acos(-1.0)#define inf 0x3f3f3f3f#define mt(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long LL;const int maxn = 1e2+20;int pos[maxn][maxn], put[maxn][maxn];int main(){ int m, n, ans, flag; scanf("%d%d", &m, &n); mt(pos, 0); mt(put, 0);//memset只能初始化0,-1,0x3f3f3f3f这三个值,所以只能绕个圈子标记 for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ scanf("%d", &pos[i][j]); if(pos[i][j] == 0){//B矩阵一个值为0,则A矩阵这个值行与列都不可能出现1 for(int k = 0; k < m; k++){ put[k][j] = 1;//用1标记0,即矩阵A不可能出现1的位置,最后1,0颠倒输出即可 } for(int k = 0; k < n; k++){ put[i][k] = 1; } } } } ans = 1; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){//所有不可能出现1的位置已标记 if(pos[i][j] == 1){//判断所有B矩阵是1的位置,判断该行与列是否可以出现1 flag = 0; for(int k = 0; k < m; k++){ if(put[k][j] == 0){ flag = 1; break; } } if(flag) continue; for(int k = 0; k < n; k++){ if(put[i][k] == 0){ flag = 1; break; } } if(flag) continue; ans = 0; break; } } } if(ans){ printf("YES\n"); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ printf("%d%c", !put[i][j], j == n-1 ? '\n' : ' ');//1,0反着输出 } } } else{ printf("NO\n"); } return 0;}
- swift中UIPickerView的使用
- Recyclew+Fragment获取手机所有程序
- use javascript for game2 slaying dragon
- SVN报403
- opencv调试-内存泄露
- Codeforces--486B---OR in Matrix思维题
- HDU 2824The Euler function
- java实现发布订阅
- 代码版模板~|owO|
- 编码格式互相转换顺序和次数
- servlet3.1规范: 第14章 部署描述符
- PHP 将CSV文件导入到Mysql数据库
- Range、Selection、TextRange对象的区别与关系
- Fragment相关API