ABC039のD問題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hukuda
記事: 5
登録日時: 9年前

ABC039のD問題について

#1

投稿記事 by hukuda » 9年前

http://abc039.contest.atcoder.jp/tasks/abc039_d
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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ABC039のD問題について

#2

投稿記事 by みけCAT » 9年前

okやdameが初期化されず、不定の値が使用されることがあるので、未定義動作ですね。
また、例えばHが1のとき、iが0のときS[i+1]にアクセスすると、やはり不定の値なのでまずいですね。
Wが1、i2が0のときのS[i2+1]は範囲外や不定ではないですが、画素として意味のない値なのでそれを読むのは間違っていると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hukuda
記事: 5
登録日時: 9年前

Re: ABC039のD問題について

#3

投稿記事 by hukuda » 9年前

解決しました。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る