• <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  回復  更多評論
              
            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            麻豆国内精品久久久久久| 久久播电影网| 久久夜色精品国产网站| 久久久精品2019免费观看| 久久精品免费一区二区三区| 精品久久人人妻人人做精品| 亚洲国产成人乱码精品女人久久久不卡 | 久久香蕉国产线看观看99| 久久精品亚洲欧美日韩久久| 欧美一区二区三区久久综| 久久夜色tv网站| 久久人妻AV中文字幕| 91秦先生久久久久久久| 国产精品99精品久久免费| 无码精品久久久久久人妻中字| 亚洲精品午夜国产va久久| 国产精品久久久久9999| 色偷偷久久一区二区三区| 国产激情久久久久影院小草 | 国产精品va久久久久久久| 久久国产劲爆AV内射—百度| 91精品久久久久久无码| 中文字幕日本人妻久久久免费 | 精品一二三区久久aaa片| 久久最新精品国产| 亚洲AV无码久久精品成人| 日本亚洲色大成网站WWW久久| 很黄很污的网站久久mimi色| 久久一日本道色综合久久| 久久精品免费一区二区| 综合久久精品色| 亚洲国产成人乱码精品女人久久久不卡 | 婷婷五月深深久久精品| 久久这里有精品| 久久久午夜精品| 2020国产成人久久精品| 欧美一区二区三区久久综| 午夜人妻久久久久久久久| 欧洲成人午夜精品无码区久久| 久久久噜噜噜久久中文字幕色伊伊| 青春久久|