Matrix Problem
生活随笔
收集整理的這篇文章主要介紹了
Matrix Problem
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Matrix Problem
題意:
給你一個n * m的二維數據c,c的每個元素值為0或1
現在要求你構造同樣大小的數組a和b,要求c[i][j] =='1’的話,a[i][j] = b[i][j] = ‘1’,如果c[i][j] ==‘0’.a[i][j]!=b[i][j],且a和b中的1都是連通的,輸出a和b任意一種情況
題解:
題目保證c的最外圍是0,既然給了這個條件且題目沒說構造不出a和b的情況,所以最外圍保證了答案一定構成
我們先考慮a,只要a確定了,b就是取反(當然還要考慮c數組)
如何構造a?我們可以讓a的最外圍全是1,然后構造如果是偶數層就讓a全等于1,奇數層全是0(也就是b全是1),
但有可能這樣,藍色部分為1,綠色部分為0,橙色部分為數組c等于1
這樣藍色是連通的,但是綠色被隔斷了,b數組就不滿足連通,如何讓綠色部分連通?如果橙色部分在第三層就好了,所以當c[i][j] == ‘1’且i為奇數時,這一層才可以成1,因為這樣上下兩層才能通過橙塊連通在一起
代碼:
//蒟蒻三人行 #include<bits/stdc++.h> typedef long long ll; using namespace std; const int maxn=700; char c[maxn][maxn]; char a[maxn][maxn]; char b[maxn][maxn]; int main() {int n,m;cin>>n>>m;char ch=getchar(); for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>c[i][j];}ch=getchar(); }for(int i=1;i<=n;i++){int ans=0;for(int j=1;j<=m;j++){if(i==1||i==n||j==1||j==m){a[i][j]='1';continue;}if(c[i][j]=='1'){ans++;a[i][j]='1';} }if(ans&&i%2==1){for(int j=2;j<m;j++)a[i][j]='1';}else {for(int j=2;j<m;j++)if(a[i][j]!='1')a[i][j]='0';}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(c[i][j]=='1')b[i][j]='1';else if(a[i][j]=='1')b[i][j]='0';else b[i][j]='1';}} // cout<<"test"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<a[i][j];} cout<<endl;} // cout<<"test"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<b[i][j];} cout<<endl;} } /* 3 3 000 000 0004 4 0000 0110 0000 000011 11 00000000000 01111011110 01000000010 01011111010 01010001010 01010101010 01010001010 01011011010 01000000010 01111111110 00000000000111111 100001 100001 100101 101001 100001 111111000000 011110 011110 011110 011110 011110 000000 */ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Matrix Problem的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 芈月传演员表介绍 芈月传主要演员介绍
- 下一篇: 手工制作玫瑰花的折法 18个步骤制作手工