お元気さまです。わくワークの義(ヨシ)です。
プログラミングスキルアップのため、paizaラーニングで問題集を解いています。
練習問題は、次のリンクから確認できます。
何度かトライして、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を学習したいと思います。
それでは、今日もワクワクな一日を!
チャオチャオ!