題解 AT1899 【畫像処理高橋君】
阿新 • • 發佈:2021-02-13
技術標籤: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;
}
轉載請說明出處