1. 程式人生 > 其它 >題解 AT1899 【畫像処理高橋君】

題解 AT1899 【畫像処理高橋君】

技術標籤:c++

題目連結

題意:給出壓縮後的影象,求壓縮前的影象

壓縮是指對於各個畫素,在其周圍8個方向的畫素中,只要有一個黑色畫素,其畫素就會變黑的處理

從這句可以初步推斷出,只要是周圍8個方向上都是黑色的畫素就是壓縮前存在的黑色畫素
例如

###..
###..
.....

壓縮前的影象就是

##...
.....
.....

這麼說來只要掃一遍,把和白色畫素相接的黑色畫素全部變為白色不就好了?

但是如果是下面這種情況

###.
##.#
..##
..##

用剛才的思路做,會得到這樣的影象

#...
....
....
...#

這樣就出現了問題

如果把得到的這個影象壓縮,得到的應該是

#...          ##..
....    ->    ##..
....          ..##
...#          ..##

這樣就還得再檢查一遍得到的影象是否合法

程式碼如下

#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[205][205];//記錄壓縮後的影象(即輸入的影象)
char b[205][205];//用於輸出壓縮前的影象
int dx[9]={1,1,1,0,0,0,-1,-1,-1};//八個方向+原地
int dy[9]={1,0,-1,1,0,-1,1,0,-1};
signed main
() { cin>>n>>m; for(int i=0; i<n; i++) cin>>a[i];//輸入 for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { int flag=0; for(int k=0; k<9; k++) { int tx = i+dx[k]; int ty = j+
dy[k]; if(tx>=0&&ty>=0&&tx<n&&ty<m&&a[tx][ty]=='.')flag=1; } if(flag)b[i][j]='.';//如果這個畫素本來就是白的,或者這是個和白色畫素相連的黑色畫素 else b[i][j]='#';//不和白色畫素相連的黑色畫素 } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(a[i][j]=='#')//檢查壓縮後的影象 { int flag=0; for(int k=0; k<9; k++) { int tx = i+dx[k]; int ty = j+dy[k]; if(tx>=0&&ty>=0&&tx<n&&ty<m&&b[tx][ty]=='#')flag=1;//該畫素是壓縮出來的 } if(!flag)//得到的壓縮前的影象 無法壓縮為 壓縮後的影象 { cout<<"impossible"<<endl;//不是合法壓縮出來的影象 return 0; } } } } cout<<"possible"<<endl;//合法 for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cout<<b[i][j]; } cout<<endl; } return 0; }

轉載請說明出處