首先設定一種對矩陣的操作:
a'_ij = a_i1 OR a_i2 OR ...... a_1j OR a_2j ....
然後給你A' 問,存不存在一個A,使的A操作後便A'。
有的話要輸出解(一個就好)
主要就是考察每一格是否可以放1(假如該格的行和列都是1,那就是可以)然後盡可能的放。
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<vector> #include<utility> #include<map> #include<set> #include<queue> #include<cmath> using namespace std; typedef long long int int64; int main() { int n, m ; scanf("%d %d", &n, &m); int build[101][101] = {0}; int mat[101][101]; int vis[101][101] = {0}; for(int lx = 0;lx < n;lx++){ for(int ly = 0;ly < m;ly++) scanf("%d", &mat[lx][ly]); } for(int lx = 0;lx < n;lx++){ for(int ly = 0;ly < m;ly++){ if(mat[lx][ly] == 0) continue; //if(vis[lx][ly] == 1) continue; bool check1 = true, check2 = true; for(int la = 0;la < n;la++) check1 = check1 and mat[la][ly] == 1; for(int lb = 0;lb < m;lb++) check2 = check2 and mat[lx][lb] == 1; if(check1 and check2){ for(int la = 0;la < n;la++) vis[la][ly] = 1; for(int lb = 0;lb < m;lb++) vis[lx][lb] = 1; build[lx][ly] = 1; } } } int count = 0; for(int lx = 0;lx < n;lx++) for(int ly = 0;ly < m;ly++) if(mat[lx][ly] and vis[lx][ly] == 0) count++; if(count){ puts("NO"); }else{ puts("YES"); for(int lx = 0;lx < n;lx++){ for(int ly = 0;ly < m;ly++) printf("%d ", build[lx][ly]); printf("\n"); } } return 0; }
沒有留言:
張貼留言