藍(lán)橋杯練習(xí)5(蘭頓螞蟻)

原創(chuàng)

問(wèn)題描述

蘭頓螞蟻,是于1986年,由克里斯·蘭頓提出來(lái)的,屬于細(xì)胞自動(dòng)機(jī)的一種。
  平面上的正方形格子被填上黑色或白色。在其中一格正方形內(nèi)有一只“螞蟻”。
  螞蟻的頭部朝向?yàn)椋荷舷伦笥移渲幸环健?br>   螞蟻的移動(dòng)規(guī)則十分簡(jiǎn)單:
  若螞蟻在黑格,右轉(zhuǎn)90度,將該格改為白格,并向前移一格;
  若螞蟻在白格,左轉(zhuǎn)90度,將該格改為黑格,并向前移一格。
  規(guī)則雖然簡(jiǎn)單,螞蟻的行為卻十分復(fù)雜。剛剛開始時(shí)留下的路線都會(huì)有接近對(duì)稱,像是會(huì)重復(fù),但不論起始狀態(tài)如何,螞蟻經(jīng)過(guò)漫長(zhǎng)的混亂活動(dòng)后,會(huì)開辟出一條規(guī)則的“高速公路”。
  螞蟻的路線是很難事先預(yù)測(cè)的。
  你的任務(wù)是根據(jù)初始狀態(tài),用計(jì)算機(jī)模擬蘭頓螞蟻在第n步行走后所處的位置。
輸入格式
  輸入數(shù)據(jù)的第一行是 m n 兩個(gè)整數(shù)(3 < m, n < 100),表示正方形格子的行數(shù)和列數(shù)。
  接下來(lái)是 m 行數(shù)據(jù)。
  每行數(shù)據(jù)為 n 個(gè)被空格分開的數(shù)字。0 表示白格,1 表示黑格。
  接下來(lái)是一行數(shù)據(jù):x y s k, 其中x y為整數(shù),表示螞蟻所在行號(hào)和列號(hào)(行號(hào)從上到下增長(zhǎng),列號(hào)從左到右增長(zhǎng),都是從0開始編號(hào))。s 是一個(gè)大寫字母,表示螞蟻頭的朝向,我們約定:上下左右分別用:UDLR表示。k 表示螞蟻?zhàn)叩牟綌?shù)。
輸出格式
  輸出數(shù)據(jù)為兩個(gè)空格分開的整數(shù) p q, 分別表示螞蟻在k步后,所處格子的行號(hào)和列號(hào)。
樣例輸入
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
樣例輸出
1 3
樣例輸入
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
樣例輸出
0 0

新手需要注意的是,在黑格右轉(zhuǎn)90度,在白格,左轉(zhuǎn)90度,是相對(duì)于螞蟻而言的,即相對(duì)于做題者在黑格要順時(shí)針轉(zhuǎn)90度,在白格要逆時(shí)針轉(zhuǎn)90度。
策略,把改變顏色和走路分為兩個(gè)步驟,在一次函數(shù)中只執(zhí)行改變當(dāng)前顏色和走一步。如是每一步都為同樣的問(wèn)題,可以采用遞歸的方式求解。

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=101;
int a[MAXN][MAXN];
int aa,b,x,y,z;
char ch;
void f(int aa,int b,int s,char ch)
{
    if(s==0)
    {
        cout<<aa<<" "<<b<<endl;
    }
    else
    {
        if(a[aa][b]==1)
        {
         a[aa][b]=0;
         if(ch=='U')f(aa,b+1,s-1,'R');
         if(ch=='R')f(aa+1,b,s-1,'D');
         if(ch=='D')f(aa,b-1,s-1,'L');
         if(ch=='L')f(aa-1,b,s-1,'U');
        }
        else
        {
          a[aa][b]=1;
         if(ch=='U')f(aa,b-1,s-1,'L');
         if(ch=='L')f(aa+1,b,s-1,'D');
         if(ch=='D')f(aa,b+1,s-1,'R');
         if(ch=='R')f(aa-1,b,s-1,'U');
        }
    }
}
int main()
{
    cin>>aa>>b;
    for(int i=0;i<aa;i++)
    {
        for(int j=0;j<b;j++)
            cin>>a[i][j];
    }
    cin>>x>>y>>ch>>z;
    f(x,y,z,ch);
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容