• <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 閱讀(946) 評論(0)  編輯 收藏 引用 所屬分類: 搜索

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕成人精品久久不卡| 久久久精品国产亚洲成人满18免费网站 | 丰满少妇人妻久久久久久4| 久久精品国产亚洲AV久| 久久性精品| 狠狠色噜噜色狠狠狠综合久久| 久久精品国产亚洲AV不卡| 一本久久a久久精品亚洲| 少妇精品久久久一区二区三区| 日本精品久久久久影院日本| 国内精品久久久久久久久| 综合久久给合久久狠狠狠97色| 天天综合久久一二三区| 中文字幕日本人妻久久久免费 | 精品久久久中文字幕人妻| 欧美国产成人久久精品| …久久精品99久久香蕉国产| 国产精品免费久久| 无码精品久久久天天影视 | 99国内精品久久久久久久| 久久国产精品免费一区| 伊人久久综合成人网| 亚洲国产成人久久精品动漫| 欧美精品丝袜久久久中文字幕| 人人狠狠综合久久88成人| 久久av高潮av无码av喷吹| 无码AV波多野结衣久久| 国产成人久久777777| 国内精品人妻无码久久久影院导航 | 亚洲精品乱码久久久久久蜜桃 | 99久久亚洲综合精品网站| 久久久久久国产精品无码下载| 色综合久久天天综合| 久久国产劲爆AV内射—百度| 青青青青久久精品国产| 无码人妻久久久一区二区三区| 久久人人爽人人澡人人高潮AV| 久久99精品国产自在现线小黄鸭 | 韩国免费A级毛片久久| 亚洲欧美另类日本久久国产真实乱对白 | 久久狠狠一本精品综合网|