機器人按照給定的指令在網格中移動,判斷能否走出網格。

問題描述
機器人按照給定的指令在網格中移動,指令有以下四種:
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章