posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          USACO 1.2.2 Lamps

          Posted on 2007-06-29 22:29 ZelluX 閱讀(273) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Algorithm
          wrong answer了幾次,總算過(guò)了
          gdb還是不怎么會(huì)用,調(diào)試dfs時(shí)不知道怎么跳出當(dāng)前層(finish和up貌似都不管用),以及如何step over

          /*

          PROG: lamps
          ID: 06301031
          LANG: C++
          */

          #include 
          <iostream>
          #include 
          <fstream>
          #include 
          <vector>
          #include 
          <algorithm>

          using namespace std;

          struct StateArray
          {
              
          bool value[100];
          };

          int n, c;
          int methodCount = 0;
          vector
          <int> reqOn, reqOff;
          vector
          <StateArray> result;
          int method[4];
          bool state[100];   // On - true,  Off - false

          bool equalState(const StateArray& s1, const StateArray& s2)
          {
              
          for (int i = 0; i < n; i++)
                  
          if (s1.value[i] != s2.value[i])
                      
          return false;
              
          return true;
          }

          bool compareState(const StateArray& s1, const StateArray& s2)
          {
              
          for (int i = 0; i < n; i++)
                  
          if (s1.value[i] != s2.value[i])
                      
          return !s1.value[i];
              
          return false;
          }

          void changeState(int m) // m[0,4] refers to the method
          {
              
          switch (m)
              {
                  
          case 0:
                      
          for (int i = 0; i < n; i++)
                          state[i] 
          = !state[i];
                      
          break;
                  
          case 1:
                      
          for (int i = 0; i < n; i += 2)
                          state[i] 
          = !state[i];
                      
          break;
                  
          case 2:
                      
          for (int i = 1; i < n; i += 2)
                          state[i] 
          = !state[i];
                      
          break;
                  
          case 3:
                      
          for (int i = 0; i < n; i += 3)
                          state[i] 
          = !state[i];
                      
          break;
              }
          }

          bool validState()
          {
              
          for (int i = 0; i < reqOn.size(); i++)
                  
          if (!state[reqOn[i]])
                      
          return false;
              
          for (int i = 0; i < reqOff.size(); i++)
                  
          if (state[reqOff[i]])
                      
          return false;
              
          return true;
          }

          void DFS(int t)  // t: method number
          {
              
          if ((methodCount > c) || (t >= 4))
                  
          return;
              
          for (int i = 0; i < 2; i++)
              {
                  
          if (i == 1)
                  {
                      methodCount
          ++;
                      changeState(t);
                      
          if (((c - methodCount) % 2 == 0&& validState())
                      {
                          StateArray tempState;
                          
          for (int j = 0; j < n; j++)
                          {
                              tempState.value[j] 
          = state[j];
                          }
                          result.push_back(tempState);
                      }
                      DFS(t 
          + 1);
                      methodCount
          --;
                      changeState(t);
                  }
                  
          else
                  {
                      
          if (((c - methodCount) % 2 == 0&& validState())
                      {
                          StateArray tempState;
                          
          for (int j = 0; j < n; j++)
                          {
                              tempState.value[j] 
          = state[j];
                          }
                          result.push_back(tempState);
                      }
                      DFS(t 
          + 1);
                  }
              }
          }

          int main()
          {
              ifstream fin(
          "lamps.in");
              ofstream fout(
          "lamps.out");
              fin 
          >> n >> c;
              
          int x;
              
          while (fin >> x)
                  
          if (x == -1)
                      
          break;
                  
          else
                      reqOn.push_back(x 
          - 1);
              
          while (fin >> x)
                  
          if (x == -1)
                      
          break;
                  
          else
                      reqOff.push_back(x 
          - 1);
              
          for (int i = 0; i < n; i++)
                  state[i] 
          = true;
              DFS(
          0);
              
          if (result.size() < 1)
                  fout 
          << "IMPOSSIBLE\n";
              sort(result.begin(), result.end(), compareState);
              vector
          <StateArray>::iterator iter;
              vector
          <StateArray> uni;
              
          for (iter = result.begin(); iter != result.end(); iter++)
                  
          if (uni.empty() || !equalState(uni[uni.size() - 1], *iter))
                      uni.push_back(
          *iter);
              
          for (int i = 0; i < uni.size(); i++)
              {
                  
          for (int j = 0; j < n; j++)
                  {
                      fout 
          << uni[i].value[j];
                  }
                  fout 
          << endl;
              }
              
          return 0;
          }

          主站蜘蛛池模板: 卫辉市| 腾冲县| 莆田市| 博兴县| 四平市| 吴旗县| 新绛县| 西华县| 友谊县| 桃源县| 临沧市| 岳池县| 华池县| 屏边| 大名县| 柏乡县| 库车县| 堆龙德庆县| 彰武县| 玛曲县| 吉安县| 南溪县| 七台河市| 通河县| 天津市| 金平| 皮山县| 莱西市| 肃宁县| 胶南市| 新绛县| 社旗县| 龙川县| 钟山县| 罗源县| 广饶县| 邵东县| 黄山市| 建德市| 南召县| 镇巴县|