2 値画像に対して収縮を行った後の値の入力を受けて、収縮前の画像が返せればそれを、
返せなければ"impossible"を返す問題なのですが、一部が通りません。
どこが不味いのか教えて下さい。後、この手の問題でもう少し短く書く方法も教えてくださると嬉しいです。
#include <stdio.h>
int main(){
int H,W;
char S[100][100];
int ok[100][100];
int dame;
int co;
scanf("%d %d",&H,&W);
for(int i=0;i<H;i++){
scanf("%s",S[i]);
}
for(int i=0;i<H;i++){
for(int i2=0;i2<W;i2++){
co=0;
if(i==0&&i2==0){
co+=5;
if(S[i][i2+1]=='#'){co++;}
if(S[i+1][i2]=='#'){co++;}
if(S[i+1][i2+1]=='#'){co++;}
}
else if(i==H-1&&i2==W-1){
co+=5;
if(S[i][i2-1]=='#'){co++;}
if(S[i-1][i2]=='#'){co++;}
if(S[i-1][i2-1]=='#'){co++;}
}
else if(i==0&&i2==W-1){
co+=5;
if(S[i][i2-1]=='#'){co++;}
if(S[i+1][i2]=='#'){co++;}
if(S[i+1][i2-1]=='#'){co++;}
}
else if(i==H-1&&i2==0){
co+=5;
if(S[i][i2+1]=='#'){co++;}
if(S[i-1][i2]=='#'){co++;}
if(S[i-1][i2+1]=='#'){co++;}
}
else if(i==0){
co+=3;
if(S[i][i2+1]=='#'){co++;}
if(S[i][i2-1]=='#'){co++;}
if(S[i+1][i2]=='#'){co++;}
if(S[i+1][i2-1]=='#'){co++;}
if(S[i+1][i2-1]=='#'){co++;}
}
else if(i2==0){
co+=3;
if(S[i+1][i2]=='#'){co++;}
if(S[i-1][i2]=='#'){co++;}
if(S[i][i2+1]=='#'){co++;}
if(S[i-1][i2+1]=='#'){co++;}
if(S[i+1][i2+1]=='#'){co++;}
}
else if(i==H-1){
co+=3;
if(S[i][i2+1]=='#'){co++;}
if(S[i][i2-1]=='#'){co++;}
if(S[i-1][i2]=='#'){co++;}
if(S[i-1][i2-1]=='#'){co++;}
if(S[i-1][i2-1]=='#'){co++;}
}
else if(i2==W-1){
co+=3;
if(S[i+1][i2]=='#'){co++;}
if(S[i-1][i2]=='#'){co++;}
if(S[i][i2-1]=='#'){co++;}
if(S[i-1][i2-1]=='#'){co++;}
if(S[i+1][i2-1]=='#'){co++;}
}
else {
if(S[i-1][i2]=='#'){co++;}
if(S[i-1][i2+1]=='#'){co++;}
if(S[i-1][i2-1]=='#'){co++;}
if(S[i][i2-1]=='#'){co++;}
if(S[i][i2]=='#'){co++;}
if(S[i][i2+1]=='#'){co++;}
if(S[i+1][i2-1]=='#'){co++;}
if(S[i+1][i2]=='#'){co++;}
if(S[i+1][i2+1]=='#'){co++;}
}
if(co==8)ok[i][i2]=2; //周囲がすべて'#'か壁があれば記録
}
}
for(int i=0;i<H;i++){
for(int i2=0;i2<W;i2++){
if(ok[i][i2]!=2&&S[i][i2]=='#'){//周囲がすべて'#'か壁の'#'が隣にあれば"."にもどす
if(i==0&&i2==0){
if(ok[i][i2+1]==2){S[i][i2]='.';}
if(ok[i+1][i2]==2){S[i][i2]='.';}
if(ok[i+1][i2+1]==2){S[i][i2]='.';}
}
else if(i==H-1&&i2==W-1&&H!=1&&W!=1){
if(ok[i][i2-1]==2){S[i][i2]='.';}
if(ok[i-1][i2]==2){S[i][i2]='.';}
if(ok[i-1][i2-1]==2){S[i][i2]='.';}
}
else if(i==0){
if(ok[i][i2+1]==2){S[i][i2]='.';}
if(ok[i][i2-1]==2){S[i][i2]='.';}
if(ok[i+1][i2]==2){S[i][i2]='.';}
if(ok[i+1][i2-1]==2){S[i][i2]='.';}
if(ok[i+1][i2-1]==2){S[i][i2]='.';}
}
else if(i2==0){
if(ok[i+1][i2]==2){S[i][i2]='.';}
if(ok[i-1][i2]==2){S[i][i2]='.';}
if(ok[i][i2+1]==2){S[i][i2]='.';}
if(ok[i-1][i2+1]==2){S[i][i2]='.';}
if(ok[i+1][i2+1]==2){S[i][i2]='.';}
}
else if(i==H-1){
if(ok[i][i2+1]==2){S[i][i2]='.';}
if(ok[i][i2-1]==2){S[i][i2]='.';}
if(ok[i-1][i2]==2){S[i][i2]='.';}
if(ok[i-1][i2-1]==2){S[i][i2]='.';}
if(ok[i-1][i2-1]==2){S[i][i2]='.';}
}
else if(i2==W-1){
if(ok[i+1][i2]==2){S[i][i2]='.';}
if(ok[i-1][i2]==2){S[i][i2]='.';}
if(ok[i][i2-1]==2){S[i][i2]='.';}
if(ok[i-1][i2-1]==2){S[i][i2]='.';}
if(ok[i+1][i2-1]==2){S[i][i2]='.';}
}
else {
if(ok[i-1][i2]==2){S[i][i2]='.';}
if(ok[i-1][i2+1]==2){S[i][i2]='.';}
if(ok[i-1][i2-1]==2){S[i][i2]='.';}
if(ok[i][i2-1]==2){S[i][i2]='.';}
if(ok[i][i2]==2){S[i][i2]='.';}
if(ok[i][i2+1]==2){S[i][i2]='.';}
if(ok[i+1][i2-1]==2){S[i][i2]='.';}
if(ok[i+1][i2]==2){S[i][i2]='.';}
if(ok[i+1][i2+1]==2){S[i][i2]='.';}
}
}
if(ok[i][i2]!=2&&S[i][i2]=='#'){dame=2;i=H;i2=W;}//周囲がすべて'#'か壁の'#'が隣になければ復元不可
}
}
if(dame==2)printf("impossible\n");
else {
printf("possible\n");
for(int i=0;i<H;i++){
for(int i2=0;i2<W;i2++){
printf("%c",S[i][i2]);
}
printf("\n");
}
}
return 0;
}