問題描述
機器人按照給定的指令在網格中移動,指令有以下四種:
N 向北(上)移動
S 向南(下)移動
E 向東(右)移動
W 向西(左)移動
如下圖所示,在網格1中,機器人初始位於網格第1行第5列,按照網格中的指令,機器人在走出網格前需要10步。在網格2中,機器人初始位於網格第1行第1列,按照網格中的指令,機器人將進入一個循環,永遠走不出網格,且在進入循環前走了11步。
假定機器人初始時刻總是在網格第一行的某一列上,請你寫一個程序確定機器人能否走出網格,並輸出走出網格或進入循環需要的步數。
輸入說明
輸入數據第一行爲空格分隔的3個整數,分別表示網格行數N、列數M和初始時刻機器人所在的列C(從網格最左邊開始,以1爲基準計數)。每個網格的行數和列數均不超過20。接下來是N行指令,指令只包含N,S,E和W四種,所有指令之間沒有空格。
輸出說明
如果機器人可以走出網格,輸出"out "加上走出網格需要的步數;如果機器人進入循環不能走出網格,輸出"loop "以及進入循環前走的步數。
輸入樣例
3 6 5
NEESWE
WWWESS
SNWWWW
輸出樣例
out 10
這道題目的難度較大,要求機器人按照所給的指令在網格中行走,判斷能否走出網格並輸出步數。我們的思路爲: 可以用一個二維字符數組來輸入指令,然後我們創立一個二維數字數組,並全部初始化爲0。若機器人已經走過這個地方,令這個位置的數字等於1,機器人進行下一步的行走時,判斷下一個位置是否爲1, 若爲1 ,證明機器人陷入了循環,我們輸出 loop 及走過的步數即可。若下一個位置超過了數組邊界,證明機器人成功走出了網格,我們輸出out 及走過的步數即可。
我們的代碼及詳細註釋如下。
#include <stdio.h>
int main()
{
int m , n , q , i , j;
scanf("%d %d %d",&m,&n,&q); //輸入數據
getchar(); //清除換行符
char a[m][n]; //定義二維字符數組
for(i = 0 ; i< m ; i++)
{
for(j = 0 ;j < n ; j++)
{a[i][j] = getchar();}
getchar(); //清除換行產生的換行符
}
int num[m][n]; //定義二維數字數組
for(i = 0 ; i< m ; i++)
{
for(j = 0 ;j < n ; j++)
num[i][j] = 0 ; //全部初始化爲 0
}
int bushu = 0 ; //記錄所走的步數
int hang = 0 , lie = q - 1; //機器人起始位置的行數及列數
char c =a[hang][lie];
num[hang][lie] = 1;
while(hang!=-1&&hang!=m&&lie!=-1&&lie!=n) //機器人沒有走出邊界時一直進行循環
{
switch(c)
{
case 'N' : //向上走
{
hang--; //所在行減1
if(num[hang][lie]==1) //爲 1 ,證明陷入了循環
{printf("loop %d",bushu+1);return 0;} //步數加 1後輸出並結束程序
num[hang][lie] = 1;
//讓該位置爲 1,證明我們已經走過
break ;
}
case 'W' : //向左走
{
lie--; //所在列減 1
if(num[hang][lie]==1) //爲 1 ,證明陷入了循環
{printf("loop %d",bushu+1);return 0;} //步數加 1 後輸出並結束程序
num[hang][lie] = 1;
//讓該位置爲 1 ,證明我們已經走過
break ;
}
case 'S' : //向下走
{
hang++; //所在行加 1
if(num[hang][lie]==1) //爲 1 ,證明陷入了循環
{printf("loop %d",bushu+1);return 0;} //步數加 1 後輸出並結束程序
num[hang][lie] = 1;
//讓該位置爲 1 ,證明我們已經走過
break;
}
case 'E' : //向右走
{
lie++; //所在列加 1
if(num[hang][lie]==1) //爲 1 ,證明陷入了循環
{printf("loop %d",bushu+1);return 0;} //步數加 1 後輸出並結束程序
num[hang][lie] = 1;
//讓該位置爲 1 ,證明我們已經走過
break;
}
}
c = a[hang][lie] ; //獲取當前位置的指令
bushu++ ; //走完 1 步,讓 bushu 加 1
}
printf("out %d",bushu); //跳出while循環,證明機器人成功走出了網格。輸出 out 及當前步數即可
return 0;
}