日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归--红与黑

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归--红与黑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述?(其實就是POJ的1979,那上面的測試數據更多)
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一
塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能夠到達多
少塊黑色的瓷磚。
輸入數據
包括多個數據集合。每個數據集合的第一行是兩個整數W 和H,分別表示x 方向
和y 方向瓷磚的數量。W 和H 都不超過20。在接下來的H 行中,每行包括W 個字符。
每個字符表示一塊瓷磚的顏色,規則如下
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,并且你站在這塊瓷磚上。該字符在每個數據集合中唯一出現一
次。
當在一行中讀入的是兩個零時,表示輸入結束。
輸出要求
對每個數據集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時
包括初始位置的瓷磚)。
輸入樣例

6 9
....#.
.....#
......
......
......

......
......
#@...#
.#..#.
0 0

我的思路:每個點都有四個方向可以走,那么就往四個方向遞歸唄。f(x,y)=f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1),然后把每個走過的點做標記。但是出口的條件是什么??不知道!!思考了半天想不出來。其實很簡單!沒走過一點就加個一!!這個是關鍵!!?? 出口就是當出界或者遇到紅色的。 我的方法是建立個int型二位數組與之對應,其實是多此一舉,只需要用一個char型數組就OK了。

下面是我的程序:

#include <stdio.h>
#include <stdlib.h>

int arr[20][20];
int w,h;


int step(int x, int y)
{
??? if(x>=h || x<0 || y>=w || y<0 || arr[x][y]==1)
??? {
??????? return 0;
??? }
??? else if(arr[x][y] == 0)
??? {
??????? arr[x][y]=1;
??????? return 1+step(x+1,y)+step(x-1,y)+
??????????? +step(x,y+1)+step(x,y-1);
??? }
}

void printArr(int x,int y)
{
??? int r,c;
??? for(r = 0; r < x; r++)
??? {
??????? for(c = 0; c < y; c++)
??????? {
??????????? printf("%d",arr[r][c]);
??????? }
??????? printf("\n");
??? }
}

int main()
{
??? int r,c;
??? int px,py;? //start position
??? int nCount;
??? char szStr[21];
??? //FILE *fp;
??? //fp=fopen("in.txt","r");

?? ?
??? while(scanf("%d%d",&w,&h) && w!=0 && h!=0)
??? {
??????? memset(arr,0,sizeof(arr));
?????? ?
??????? for(r = 0; r < h; r++)
??????? {
??????????? //fscanf(fp,"%s",&szStr);
??????????? scanf("%s",&szStr);
??????????? for(c = 0; c < w; c++)
??????????? {
??????????????? if(szStr[c] == '.')
??????????????? {
??????????????????? arr[r][c]=0;
??????????????? }
??????????????? else if(szStr[c] == '#')
??????????????? {
??????????????????? arr[r][c]=1;
??????????????? }
??????????????? else
??????????????? {
??????????????????? px=r;py=c;
??????????????? }
??????????? }
??????? }//for
?? ?
??????? nCount=step(px,py);

??????? //printArr(h,w);
??????? printf("%d\n",nCount);
??? }?? ?
??? return 0;
}
/5/17

?修改后的程序:

#include <stdio.h>
#include <stdlib.h>

char szArr[21][21];
int w,h;

int step(int x, int y)
{
??? if(x>=h || x<0 || y>=w || y<0 || szArr[x][y] == '#')
??? {
??????? return 0;
??? }
??? else if(szArr[x][y] == '.' || szArr[x][y] == '@')
??? {
??????? szArr[x][y]='#';
??????? return 1+step(x+1,y)+step(x-1,y)+
??????????? +step(x,y+1)+step(x,y-1);
??? }
}

int main()
{
??? int r,c;
??? int px,py;? //start position
??? int nCount;
??? //FILE *fp;
??? //fp=fopen("in.txt","r");

?? ?
??? while(scanf("%d%d",&w,&h) && w!=0 && h!=0)
??? {?? ?
??????? for(r = 0; r < h; r++)
??????? {
??????????? //fscanf(fp,"%s",szArr[r]);
??????????? scanf("%s",szArr[r]);
??????????? for(c = 0; c < w; c++)
??????????? {
??????????????? if(szArr[r][c] == '@')
??????????????? {
??????????????????? px=r;py=c;
??????????????? }
??????????? }
??????? }

??????? nCount=step(px,py);
??????? printf("%d\n",nCount);
??? }

??? return 0;
}

總結

以上是生活随笔為你收集整理的递归--红与黑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。