NEFU561 方塊計算【遞迴】

來源:互聯網
上載者:User

標籤:

題目連結:

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=561


題目大意:

在一間M*N的長方形房間裡,地上鋪了白色、黑色兩種顏色的正方形瓷磚,你站在其中一塊

黑色瓷磚上,只能向相鄰的黑色瓷磚移動。問:總共能夠達到多少快黑色的瓷磚。

資料中,‘.‘表示黑色的瓷磚,‘#‘表示白色的瓷磚,‘@‘表示你站的這塊瓷磚(該瓷磚是黑色的)。


思路:

只能向相鄰的黑色瓷磚移動,那麼對於位置(x,y),就只能向(x+1,y),(x,y+1),(x-1,y),

(x,y+1)的黑色的瓷磚移動。每次移動的時候看看沒走過的瓷磚是不是黑色的瓷磚,如果是就

繼續走,否則就返回。用ans儲存走過的黑色瓷磚塊數,最終遞迴方程為f(x,y) = f(x+1,y) +

 (x,y+1) + (x-1,y) + (x,y+1)。

為了避免重複計算走過的瓷磚數,將每一塊走過的瓷磚標記為白色,這樣就不會重複計算了。


AC代碼:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int N,M;char Map[35][35];int DFS(int x,int y){    int d = 0;    if(x < 0 || x >= N || y < 0 || y >= M || Map[x][y] == '#')        return 0;   //返回,遞迴邊界    if(Map[x][y] == '.' || Map[x][y] == '@')    {        d = 1;      //標記,避免重複搜尋        Map[x][y] = '#';    }    return DFS(x+1,y) + DFS(x,y+1) + DFS(x-1,y) + DFS(x,y-1) + d;}int main(){    while(~scanf("%d%d",&M,&N) && (N||M))    {        int ans = 0;        for(int i = 0; i < N; ++i)            scanf("%s",Map[i]);        for(int i = 0; i < N; ++i)            for(int j = 0; j < M; ++j)                if(Map[i][j] == '@')                    ans = DFS(i,j);        printf("%d\n",ans);    }    return 0;}


NEFU561 方塊計算【遞迴】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.