• <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)友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久电影网2021| 久久天天躁夜夜躁狠狠躁2022| 人人狠狠综合久久88成人| 偷窥少妇久久久久久久久| 久久中文字幕人妻丝袜| 国产69精品久久久久777| 国产精品永久久久久久久久久| 国内精品伊人久久久影院| 久久99国产精品99久久| 色综合合久久天天给综看| 狠狠色婷婷久久一区二区三区| 国产激情久久久久影院小草| 亚洲伊人久久成综合人影院| 亚洲国产精品热久久| 久久无码AV一区二区三区| 色综合久久中文综合网| 国内精品久久久久影院薰衣草| 色综合久久88色综合天天| 亚洲国产另类久久久精品| 久久国产精品偷99| 久久精品欧美日韩精品| 伊人久久亚洲综合影院| 国产精品VIDEOSSEX久久发布| 亚洲午夜无码久久久久| 热久久国产欧美一区二区精品| 久久亚洲欧美日本精品| 精品国产乱码久久久久久郑州公司 | 香蕉99久久国产综合精品宅男自 | 亚洲精品无码久久久久AV麻豆| 精品国产乱码久久久久久1区2区| 精品久久久久成人码免费动漫| 国产精品伦理久久久久久| 久久青青草原精品影院| 97久久精品国产精品青草| 777午夜精品久久av蜜臀| 欧美性大战久久久久久| 日产久久强奸免费的看| 久久久99精品一区二区| 久久e热在这里只有国产中文精品99 | 91精品国产综合久久香蕉| 亚洲国产精品久久久久久|