• <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。題意類似于圖像識別里面,搜索一張圖像里面的某個指定區(qū)域里面有幾個斑點,題意里面的斑點是指色子。
            30 15 
            ..............................
            ..............................
            ...............*..............
            ...*****......****............
            ...*X***.....**X***...........
            ...*****....***X**............
            ...***X*.....****.............
            ...*****.......*..............
            ..............................
            ........***........******.....
            .......**X****.....*X**X*.....
            ......*******......******.....
            .....****X**.......*X**X*.....
            ........***........******.....
            ..............................
            比如上面這個30 * 15的圖片里面,一共有四個區(qū)域,*作為區(qū)域的底色,然后是求區(qū)域里面有多少個X的塊。這個題單純dfs的話,很沒辦法,因為無法一次性把連接在一起的X都搜索了。比如,
            5 5
            XXX*X 
            XXX*X 
            ..... 
            X***X 
            XX*** 
            的時候,dfs很明顯就會出現(xiàn)問題,因為會先離開X塊,再次回到X塊,計數(shù)就會出現(xiàn)問題了。因此只能遇到X的時候,進(jìn)行一次bfs,將與其相連接的X全部搜索掉。。。并且找到與當(dāng)前X塊相連接的一個*的位置,如果有這樣的位置,就繼續(xù)進(jìn)行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);//擴散掉當(dāng)前連通的所有'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 閱讀(945) 評論(0)  編輯 收藏 引用 所屬分類: 搜索

            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導(dǎo)航

            統(tǒng)計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            性做久久久久久久久老女人| 久久国产亚洲精品无码| 久久久久久A亚洲欧洲AV冫| 久久精品国产亚洲Aⅴ香蕉| 久久午夜免费视频| 精品久久久久久成人AV| 伊人丁香狠狠色综合久久| 久久福利资源国产精品999| 成人资源影音先锋久久资源网| 一本久久a久久精品综合夜夜| 人妻无码久久精品| 狠狠色婷婷综合天天久久丁香 | 无码人妻少妇久久中文字幕| 一级做a爰片久久毛片免费陪| 久久精品夜夜夜夜夜久久| 99久久人妻无码精品系列蜜桃| 久久激情五月丁香伊人| 国产成人久久精品区一区二区| 久久国产免费直播| 91久久婷婷国产综合精品青草| 一级做a爱片久久毛片| 精品国产一区二区三区久久久狼 | 亚洲精品tv久久久久| 国产精品99精品久久免费| 香蕉久久夜色精品国产尤物| 99久久精品免费观看国产| 国产A三级久久精品| 国产亚洲美女精品久久久2020| 女人香蕉久久**毛片精品| 久久精品成人免费网站| 国产韩国精品一区二区三区久久| 久久男人AV资源网站| 国产亚洲精久久久久久无码AV| 久久国产热精品波多野结衣AV| 久久亚洲AV成人无码| 亚洲精品无码久久久| 怡红院日本一道日本久久 | 无码任你躁久久久久久| 久久亚洲2019中文字幕| 国产AV影片久久久久久| 久久国产热这里只有精品|