わくワーク

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

Aランクレベルアップメニュー「移動が可能かの判定・幅のある移動」

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

 

プログラミングスキルアップのため、paizaラーニングで問題集を解いています。

練習問題は、次のリンクから確認できます。

paiza.jp

 

何度かトライして、100点になりました。

 

 

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

#include <stdio.h>
int main(void){
    char str[1000];
    char buf[21][22];
    char han[22];
    int h,w,sy,sx,n,i,j,s,dr,err;
    char lr;
    fgets(str, sizeof(str), stdin);
    sscanf(str,"%d %d %d %d %d",&h,&w,&sy,&sx,&n);
    for(i=0;i<h;i++){
        fgets(str,sizeof(str),stdin);
        sscanf(str,"%s",buf[i]);
    }
    dr=0;
    for(i=0;i<n;i++){
        err=0;
        fgets(str,sizeof(str),stdin);
        sscanf(str,"%c %d",&lr,&s);
        if( (lr=='R' && dr==0 ) || (lr=='L' && dr==2) ){
            for(j=1;j<s;j++){
                if( sx+j>=w){
                    han[j]='#';
                }
                else {
                    han[j]=buf[sy][sx+j];
                }
            }
        }
        else if( (lr=='R' && dr==1 ) || (lr=='L' && dr==3) ){
            for(j=1;j<s;j++){
                if( sy+j>=h){
                    han[j]='#';
                }
                else {
                    han[j]=buf[sy+j][sx];
                }
            }
        }
        else if( (lr=='R' && dr==2 ) || (lr=='L' && dr==0) ){
            for(j=1;j<s;j++){
                if( sx-j<=0){
                    han[j]='#';
                }
                else {
                    han[j]=buf[sy][sx-j];
                }
            } 
        }
        else if( (lr=='R' && dr==3 ) || (lr=='L' && dr==1) ){
            for(j=1;j<s;j++){
                if( sy-j<=0){
                    han[j]='#';
                }
                else {
                    han[j]=buf[sy-j][sx];
                }
            }
        }
        for(j=1;j<s;j++){
            if( han[j]=='#' )   break;
        }
        if( j<s ){
            err=1;
            if(j==1) j--;
        }
        if( lr=='R' ){
                switch( dr ){
                    case 0:
                        sx=sx+j;
                        if( buf[sy][sx]=='#' ) sx--;
                        dr++;
                        break;
                    case 1:
                        sy=sy+j;
                        if( buf[sy][sx]=='#' ) sy--;
                        dr++;
                        break;
                    case 2:
                        sx=sx-j;
                        if( buf[sy][sx]=='#' ) sx++;
                        dr++;
                        break;
                    case 3:
                        sy=sy-j;
                        if( buf[sy][sx]=='#' ) sy++;
                        dr=0;
                        break;
                }
        }
        else {
                switch( dr ){
                    case 0:
                        sx=sx-j;
                        if( buf[sy][sx]=='#' ) sx++;
                        dr=3;
                        break;
                    case 1:
                        sy=sy-j;
                        if( buf[sy][sx]=='#' ) sy++;
                        dr--;
                        break;
                    case 2:
                        sx=sx+j;
                        if( buf[sy][sx]=='#' ) sx--;
                        dr--;
                        break;
                    case 3:
                        sy=sy+j;
                        if( buf[sy][sx]=='#' ) sy--;
                        dr--;
                        break;
                }
            
        }
        printf("%d %d\n",sy,sx);
        if(err==1){
            printf("%s\n", "Stop");
            break;
        }
    }
    return 0;
}

 

もっと簡潔にかけるような気もします。

実行結果のエラーに対処しているうちに、かなり複雑な処理になってしまいました。

C言語の解答例はありませんでしたが、C++,Python3,Rubyの解答例を見るとかなりシンプルです。

 

C言語でAランクにレベルアップできたら、次はPython3かRubyを学習したいと思います。

 

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

チャオチャオ!