zoj1411

来源:互联网 发布:战争雷霆金拉7数据 编辑:程序博客网 时间:2024/05/04 07:03

 要学的东西还有太多太多。回溯+剪枝。

#include <iostream>   #include <vector>   #include <algorithm>   #include <queue>   #include <string.h>   #include <stdio.h>   using namespace std;    bool IsValid(int index, int s, bool map[][40], int size)  {      int x = index / s;      int y = index % s;        if (x + size > s || y + size > s)          return false;        for (int i = x; i < x + size; i++)          for (int j = y; j < y + size; j++)              if (map[x][j] == true)                  return false;        return true;  }    bool DFS(int index, int s, bool map[][40], int n, int size[], bool used[])  {      if (index >= s * s)          return true;      int x = index / s;      int y = index % s;      if (map[x][y] == true)          return DFS(index + 1, s, map, n, size, used);        bool failed[16];      memset(failed, false, sizeof(failed));        for (int i = 0; i < n; i++)          if (used[i] != true && failed[size[i]] != true)              if (IsValid(index, s, map, size[i]))              {                  // map set to true                   for (int j = x; j < x + size[i]; j++)                      for (int k = y; k < y + size[i]; k++)                          map[j][k] = true;                    used[i] = true;                    if (DFS(index + 1, s, map, n, size, used))                      return true;                  else                      failed[size[i]] = true;                    used[i] = false;                    // map set to false                   for (int j = x; j < x + size[i]; j++)                      for (int k = y; k < y + size[i]; k++)                          map[j][k] = false;              }              else              {                  failed[size[i]] = true;              }        return false;  }    int main()  {      int t, s, n;      bool map[40][40];      int size[16];      bool used[16];      cin >> t;      while (t--)      {          cin >> s >> n;          for (int i = 0; i < n; i++)              cin >> size[i];          memset(map, false, sizeof(map));          memset(used, false, sizeof(used));                    int total = 0;          for (int i = 0; i < n; i++)              total += size[i] * size[i];          if (total != s * s)              cout << "HUTUTU!\n";          else          {              if (DFS(0, s, map, n, size, used))                  cout << "KHOOOOB!\n";              else                  cout << "HUTUTU!\n";          }      }return 0;  }  


 

原创粉丝点击