posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          USACO 1.2.2 Lamps

          Posted on 2007-06-29 22:29 ZelluX 閱讀(271) 評論(0)  編輯  收藏 所屬分類: Algorithm
          wrong answer了幾次,總算過了
          gdb還是不怎么會用,調試dfs時不知道怎么跳出當前層(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;
          }

          主站蜘蛛池模板: 商丘市| 淮安市| 武隆县| 安化县| 紫阳县| 南京市| 文昌市| 宜城市| 民权县| 木兰县| 武邑县| 马公市| 祥云县| 灵璧县| 宝坻区| 兴义市| 新民市| 师宗县| 金溪县| 会理县| 虞城县| 昌都县| 娄烦县| 鄄城县| 湛江市| 东城区| 松江区| 闽清县| 古丈县| 罗江县| 施甸县| 上林县| 海南省| 波密县| 安岳县| 赤壁市| 临沭县| 尉犁县| 栾城县| 盐亭县| 赣州市|