わくワーク

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

Aランクレベルアップメニュー「座標系での規則的な移動」

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

 

プログラミングスキルアップを目指して、paizaラーニングで練習問題を解いています。

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

paiza.jp

 

結構時間がかかってしまいましたが、100点取れました!

 

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

#include <stdio.h>
int main(void){
    char str[1000];
    int x,y,n,i,s,xy,xc,yc,sc;
    fgets(str, sizeof(str), stdin);
    sscanf(str,"%d %d %d",&x,&y,&n);
    xy = 1;
    xc = 0;
    yc = 0;
    s = 1;
    sc = 1;
    for(i=0;i<n;i++){
        if(xy) {
            x = x + 1 * s; 
            xc++;
        }
        else {
            y = y + 1 * s;
            yc++;
        }
        if(xc==yc){
            s = s * -1;
            xy = 1;
            sc++;
            xc = 0;
            yc = 0;
        }
        if(sc==xc){
            xy = 0;
        }
    }
    printf("%d %d\n",x,y);
    return 0;
}

 

規則的な移動の法則はつかめたものの、それを数式にするのが、なかなか難しかったです。

規則的な移動は、

x+1,y+1
x-1,x-1,y-1,y-1
x+1,x+1,x+1,y+1,y+1,y+1
x-1,x-1,x-1,x-1,y-1,y-1,y-1,y-1

というようにx座標が先でy座標が追いついてくる感じで移動します。

移動方向がそれぞれの座標で反転するので、x座標とy座標の切り替え、プラスとマイナスの切り替えのタイミングを作るために、それぞれの座標を動かしたときのカウントと、切り替えた回数のカウントをすることで解決しました。

 

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

チャオチャオ!