• <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>
            posts - 33,  comments - 25,  trackbacks - 0
            本題與POJ 1753非常相似,因此直接提交以下代碼:
              1 #include <iostream>
              2 #include <vector>
              3 #include <queue>
              4 using namespace std;
              5 
              6 
              7 const int ROW = 4;
              8 const int SIZE = ROW * ROW;
              9 const int START_ACTION = -2;
             10 const int MAX_STATE = 1 << SIZE; // 2 ^ 16
             11 const int OPEN = 65535;
             12 
             13 int ConvertCharToInt(char c)
             14 {
             15     switch(c)
             16     {
             17     case '+':
             18         return 0;
             19     case '-':
             20         return 1;
             21     }
             22     return -1;
             23 }
             24 
             25 int ChangeState(int state_id, int position)
             26 {
             27     state_id ^= (1 << position);
             28 
             29     int copy_position = position;
             30 
             31     // left-row
             32     int left_end = position / ROW * ROW;
             33     while(--copy_position >= left_end && copy_position >= 0)
             34     {
             35         state_id ^= (1 << copy_position);
             36     }
             37     copy_position = position;
             38 
             39     // right-row
             40     int right_end = (position / ROW + 1* ROW;
             41     while(++copy_position < right_end)
             42     {
             43         state_id ^= (1 << copy_position);
             44     }
             45     copy_position = position;
             46 
             47     // up-col
             48     int up_end = 0;
             49     while((copy_position -= ROW) >= up_end)
             50     {
             51         state_id ^= (1 << copy_position);
             52     }
             53     copy_position = position;
             54 
             55     // down-col
             56     int down_end = SIZE;
             57     while((copy_position += ROW) < SIZE)
             58     {
             59         state_id ^= (1 << copy_position);
             60     }
             61     return state_id;
             62 }
             63 
             64 int _tmain(int argc, _TCHAR* argv[])
             65 {
             66     int action_position[MAX_STATE];
             67     int last_action[MAX_STATE];
             68     int time[MAX_STATE];
             69 
             70     memset(action_position, -1sizeof(action_position));
             71     memset(last_action, -1sizeof(last_action));
             72     memset(time, -1sizeof(time));
             73 
             74     queue<int> search_query;
             75 
             76     char state;
             77     int current_state_id = 0;
             78 
             79     for(int i = 0; i < SIZE; ++i)
             80     {
             81         cin >> state;
             82         current_state_id += ConvertCharToInt(state) << i;
             83     }
             84 
             85     if(current_state_id == OPEN)
             86     {
             87         cout << "0" << endl;
             88         return 0;
             89     }
             90 
             91     action_position[current_state_id] = START_ACTION;
             92     last_action[current_state_id] = START_ACTION;
             93     time[current_state_id] = 0;
             94 
             95     search_query.push(current_state_id);
             96     int next_state_id;
             97 
             98     while(!search_query.empty())
             99     {
            100         current_state_id = search_query.front();
            101         search_query.pop();
            102 
            103         for(int i = 0; i < SIZE; ++i)
            104         {
            105             next_state_id = ChangeState(current_state_id, i);
            106 
            107             if(next_state_id == OPEN)
            108             {
            109                 cout << time[current_state_id] + 1 << endl;
            110                 int result = current_state_id;
            111                 vector<int> position;
            112                 position.push_back(i);
            113                 while(action_position[result] != START_ACTION)
            114                 {
            115                     position.push_back(action_position[result]);
            116                     result = last_action[result];
            117                 }
            118                 while(!position.empty())
            119                 {
            120                     cout << ((position.back() >> 2+ 1<< " " << (position.back() % 4 + 1<< endl;
            121                     position.pop_back();
            122                 }
            123                 return 0;
            124             }
            125 
            126             if(time[next_state_id] == -1 /* not visited */)
            127             {
            128                 action_position[next_state_id] = i;
            129                 last_action[next_state_id] = current_state_id;
            130                 time[next_state_id] = time[current_state_id] + 1;
            131                 search_query.push(next_state_id);
            132             }
            133         }
            134     }
            135     return 0;
            136 }
            結果TLE,至今不知道為什么,兩題測試數據相差很大么?
            在看了該題的討論版后,得知一個高效的解法,總結如下:
            先看一個簡單的問題,如何把'+'變成'-'而不改變其他位置上的狀態?答案是將該位置(i,j)及位置所在的行(i)和列(j)上所有的handle更新一次,結果該位置被更新了7次,相應行(i)和列(j)的handle被更新了6次,剩下的被更新了4次.被更新偶數次的handle不會造成最終狀態的改變.因此得出高效解法,在每次輸入碰到'+'的時候,自增該位置與相應的行和列,當輸入結束后,遍歷數組,所有為奇數的位置則是操作的位置,而奇數位置的個數之和則是最終的操作次數.
            PS:該題不會有"Impossible"的情況.代碼如下:
             1#include <iostream>
             2using namespace std;
             3
             4const int ROW = 4;
             5
             6int _tmain(int argc, _TCHAR* argv[])
             7{
             8    bool HANDLES[ROW][ROW] = {false};
             9    char handle;
            10    for(int i = 0; i < ROW; ++i)
            11    {
            12        for(int j = 0; j < ROW; ++j)
            13        {
            14            cin >> handle;
            15            if(handle == '+')
            16            {
            17                HANDLES[i][j] = !HANDLES[i][j];
            18                for(int k = 0; k < ROW; ++k)
            19                {
            20                    HANDLES[i][k] = !HANDLES[i][k];
            21                    HANDLES[k][j] = !HANDLES[k][j];
            22                }

            23            }

            24        }

            25    }

            26    int result = 0;
            27    for(int i = 0; i < ROW; ++i)
            28    {
            29        for(int j = 0; j < ROW; ++j)
            30        {
            31            if(HANDLES[i][j])
            32            {
            33                ++result;
            34            }

            35        }

            36    }

            37    cout << result << endl;
            38    for(int i = 0; i < ROW; ++i)
            39    {
            40        for(int j = 0; j < ROW; ++j)
            41        {
            42            if(HANDLES[i][j])
            43            {
            44                cout << i + 1 << " " << j + 1 << endl;
            45            }

            46        }

            47    }

            48    return 0;
            49}

            posted on 2009-03-21 11:11 肖羽思 閱讀(3738) 評論(8)  編輯 收藏 引用 所屬分類: POJ

            FeedBack:
            # re: POJ 2965 解題報告
            2010-02-15 21:35 | chhaya
            高效解法確實很NB啊。  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-04-13 20:20 | Cre
            我們可以聊一聊嗎?不止一次看過你的代碼,感覺有必要向你學習一下!  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-04-14 10:49 | 肖羽思
            @Cre
            歡迎交流哈~~學習倒談不上~~歡迎發郵件至:yusi.xiao@gmail.com  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-04-14 22:49 | Cre
            @肖羽思
            我們可以通過QQ交流嗎?感覺這種方式更方便一些!當然,如果你感覺不方便,也無大礙!  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-04-15 11:32 | 肖羽思
            @Cre
            好的~~請加:54118794  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-07-05 15:58 | Tanky Woo
            按你的寫法,似乎輸入一個+就改一次,也不論后面的是啥,
            個人感覺是錯的。要么也是先全部輸入后再調整。
            不信你輸入
            ++++
            +---
            +---
            +---
            應該輸出1沒錯吧?
            而你代碼的結果是7。
            你的意思就是算的有多少個+去了。  回復  更多評論
              
            # re: POJ 2965 解題報告
            2010-07-05 16:04 | Tanky Woo
            還有個地方寫錯了,那里分別是7次,4次,和2次,
            而不是7,6,4次
            歡迎去我博客和我探討:
            www.wutianqi.com  回復  更多評論
              
            # re: POJ 2965 解題報告
            2011-04-18 08:41 | 劉灝
            @Tanky Woo
            你說的不對,你根本沒看樓主的算法,結果必定為1  回復  更多評論
              
            <2012年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久香综合精品久久伊人| 久久精品国产免费观看三人同眠| 精品人妻久久久久久888| 久久夜色精品国产网站| 久久久精品2019免费观看| 国产精品久久久99| 亚洲午夜无码久久久久| 亚洲国产精品久久久久婷婷软件 | 久久久久久国产精品美女| 久久精品中文字幕无码绿巨人 | yy6080久久| 99久久久国产精品免费无卡顿| 久久伊人影视| 色综合久久久久网| 久久中文字幕人妻熟av女| 亚洲成人精品久久| 久久精品国产亚洲av麻豆色欲| 亚洲国产成人久久综合区| 久久综合九色综合久99| 久久妇女高潮几次MBA| 婷婷久久综合九色综合绿巨人| 97久久超碰国产精品2021| 色偷偷88888欧美精品久久久| 一本色道久久88综合日韩精品| 国产精品久久久久乳精品爆| 国产精品久久午夜夜伦鲁鲁| 久久99久国产麻精品66| 午夜精品久久久久久久无码| 国产精品久久久久一区二区三区 | 久久婷婷五月综合97色| 亚洲国产天堂久久久久久 | 久久久久久久久波多野高潮| 9999国产精品欧美久久久久久| 俺来也俺去啦久久综合网| 久久精品国产亚洲AV高清热| 国产精品一区二区久久国产| 欧美牲交A欧牲交aⅴ久久| 久久久久久亚洲Av无码精品专口| 久久男人Av资源网站无码软件| 精品永久久福利一区二区| 久久99国产精一区二区三区|