• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            uva 657 - The die is cast

               這個題不錯,居然需要在dfs里面寫bfs。題意類似于圖像識別里面,搜索一張圖像里面的某個指定區域里面有幾個斑點,題意里面的斑點是指色子。
            30 15 
            ..............................
            ..............................
            ...............*..............
            ...*****......****............
            ...*X***.....**X***...........
            ...*****....***X**............
            ...***X*.....****.............
            ...*****.......*..............
            ..............................
            ........***........******.....
            .......**X****.....*X**X*.....
            ......*******......******.....
            .....****X**.......*X**X*.....
            ........***........******.....
            ..............................
            比如上面這個30 * 15的圖片里面,一共有四個區域,*作為區域的底色,然后是求區域里面有多少個X的塊。這個題單純dfs的話,很沒辦法,因為無法一次性把連接在一起的X都搜索了。比如,
            5 5
            XXX*X 
            XXX*X 
            ..... 
            X***X 
            XX*** 
            的時候,dfs很明顯就會出現問題,因為會先離開X塊,再次回到X塊,計數就會出現問題了。因此只能遇到X的時候,進行一次bfs,將與其相連接的X全部搜索掉。。。并且找到與當前X塊相連接的一個*的位置,如果有這樣的位置,就繼續進行dfs。

            代碼如下:
            #include <stdio.h>
            #include <string.h>
            #include <algorithm>
            #include <queue>
            using namespace std;

            int nW, nH;
            char szData[100][100];
            bool bVisit[100][100];
            int nNum;
            int nDice[100];
            int nAdd[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};

            bool IsPosOk(int i, int j)
            {
                return i >= 0 && i < nH && j >= 0 && j < nW;
            }

            struct POS
            {
                int nI;
                int nJ;
            };

            bool Bfs(int& nI, int& nJ)
            {
                bool bRet = false;
                queue<POS> qp;
                POS pos = {nI, nJ};
                int i = nI, j = nJ;

                qp.push(pos);
                while (qp.empty() == false)
                {
                    POS head = qp.front();
                    qp.pop();

                    for (int m = 0; m < 4; ++m)
                    {
                        int nNextI = head.nI + nAdd[m][0];
                        int nNextJ = head.nJ + nAdd[m][1];

                        if (IsPosOk(nNextI, nNextJ) && bVisit[nNextI][nNextJ] == false)
                        {
                            if (szData[nNextI][nNextJ] == 'X')
                            {
                                bVisit[nNextI][nNextJ] = true;
                                POS pos = {nNextI, nNextJ};
                                qp.push(pos);
                            }
                            else if (szData[nNextI][nNextJ] == '*')
                            {
                                bRet = true;
                                nI = nNextI;//   這里是返回新的dfs位置
                                nJ = nNextJ;
                            }
                        }
                    }
                }
                
                return bRet;
            }

            void dfs(int i, int j, int nNum)
            {
                bVisit[i][j] = true;
                if (szData[i][j] == 'X')
                {
                    nDice[nNum]++;
                    bool bDfs = Bfs(i, j);//擴散掉當前連通的所有'X'
                    if (bDfs == false)
                    {
                        return;
                    }
                    else
                    {
                        dfs(i, j, nNum);
                    }
                }

                for (int m = 0; m < 4; ++m)
                {
                    int nNextI = i + nAdd[m][0];
                    int nNextJ = j + nAdd[m][1];

                    if (IsPosOk(nNextI, nNextJ) && bVisit[nNextI][nNextJ] == false
                            && szData[nNextI][nNextJ] != '.')
                    {
                        dfs(nNextI, nNextJ, nNum);
                    }
                }
            }

            int main()
            {
                int nCases = 1;

                while (scanf("%d%d", &nW, &nH), nW + nH)
                {
                    for (int i = 0; i < nH; ++i)
                    {
                        scanf("%s", szData[i]);
                    }
                    memset(bVisit, falsesizeof(bVisit));
                    memset(nDice, 0, sizeof(nDice));
                    nNum = 0;

                    for (int i = 0; i < nH; ++i)
                    {
                        for (int j = 0; j < nW; ++j)
                        {
                            if (szData[i][j] == 'X' && bVisit[i][j] == false)
                            {
                                dfs(i, j, nNum);
                                nNum++;
                            }
                        }
                    }
                    sort(nDice, nDice + nNum);

                    printf("Throw %d\n", nCases++);
                    for (int i = 0; i < nNum; ++i)
                    {
                        printf("%d%s", nDice[i], i == nNum - 1 ? "\n" : " ");
                    }
                    printf("\n");
                }

                return 0;
            }

            posted on 2012-07-14 21:16 yx 閱讀(950) 評論(0)  編輯 收藏 引用 所屬分類: 搜索

            <2012年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久国产精品无码下载 | 国产精品狼人久久久久影院| 精品久久无码中文字幕| 国产精品久久久久久久久免费| 国产精品一区二区久久精品| 久久精品国产亚洲AV不卡| 久久人人爽人人爽人人片AV高清| 亚洲中文字幕无码久久2017 | 久久久噜噜噜久久| 久久人人爽人人爽人人片AV不| 国产精品久久网| 久久亚洲精品无码VA大香大香| 国产精品久久成人影院| 国产精品久久久香蕉| 国产99久久久国产精免费| 久久狠狠高潮亚洲精品| 亚洲国产精品成人AV无码久久综合影院| 人妻精品久久久久中文字幕一冢本 | 久久精品国产亚洲AV高清热| 精品无码久久久久久久久久| 久久精品国产亚洲AV高清热| 国产美女亚洲精品久久久综合| 精品久久久久久无码中文野结衣| 精品无码久久久久久尤物| 免费精品久久天干天干| 亚洲国产成人久久综合碰| 久久精品国产第一区二区| 中文字幕亚洲综合久久2| 国产成人久久AV免费| 国内精品久久久久影院优| 日韩av无码久久精品免费| 久久夜色精品国产噜噜亚洲AV| 2019久久久高清456| 一本久道久久综合狠狠躁AV| 久久久久一级精品亚洲国产成人综合AV区 | 色综合久久夜色精品国产| 久久亚洲电影| 久久亚洲中文字幕精品一区| 狠狠综合久久综合88亚洲| 婷婷伊人久久大香线蕉AV| 97久久精品无码一区二区|