わくワーク

2022年3月に早期退職し起業しました。仕事、趣味について発信する雑記ブログです。当ブログはGoogleアドセンス及びアフィリエイト広告を利用しています。

Aランクレベルアップメニュー「マップの判定・縦横」

お元気さまです。わくワークの義(ヨシ)です。

 

C言語のスキルアップのために、練習問題を進めています。

練習問題は、次のリンクから見ることができます。

paiza.jp

 

今回の問題は、縦だけ、横だけの判定プログラムより複雑で、難しく感じました。

 

判定の方法は他にもあるかもしれませんが、上下左右の4方向のマスの情報を判定してヒットしたら1ポイント加算し、4ポイントになったら条件一致とするやり方にしました。

右端、左端、上端、下端の場合、それぞれ1方向が欠如するので、問題にある特別ルールで加算しています。

 

提出したコードは次のとおりです。

 

#include <stdio.h>
int main(void){
    char str[1000];
    char buf[20][21];
    int h,w,i,x,y,r;
    fgets(str, sizeof(str), stdin);
    sscanf(str,"%d %d",&h,&w);
    for(i=0;i<h;i++){
        fgets(str,sizeof(str),stdin);
        sscanf(str,"%s",buf[i]);
    }
    for(y=0;y<h;y++){
        for(x=0;x<w;x++){
            r = 0;
            if( x==0 && buf[y][x+1]=='#') {
                r = r + 1;
            }
            else if( x==w-1 && buf[y][x-1]=='#'){
                r = r + 1;
            }
            if( y==0 && buf[1][x]=='#'){
                r = r + 1;
            }
            else if( y==h-1 && buf[y-1][x]=='#'){
                r = r + 1;
            }
            if( y!=0 && buf[y-1][x]=='#' ){
                r = r + 1;
            }
            if( y!=h-1 && buf[y+1][x]=='#' ){
                r = r + 1;
            }
            if( x!=0 && buf[y][x-1]=='#'){
                r = r + 1;
            }
            if( x!=w-1 && buf[y][x+1]=='#'){
                r = r + 1;
            }
            if( r == 4){
                printf("%d %d\n",y,x);
            }
        }
    }
    return 0;
}

 

それでは、今日もワクワクな一日を!

チャオチャオ!