Guarding the Chessboard(UVA 11214)

网址如下:

Guarding the Chessboard - UVA 11214 - Virtual Judge

(第三方网址)

绞尽脑汁优化算法,结果暴力遍历就够了

孩子你无敌了

本质上是IDA

甚至不用剪枝

代码如下:

cpp 复制代码
#include<cstdio>
#include<algorithm>
#include<cstring>

const int maxn = 9;

bool G[maxn][maxn];
int vis[4][17];
int n, m;

bool succeed(void){
   for(int i = 0; i < n; i++)
      for(int j = 0; j < m; j++)
         if(G[i][j] && !vis[0][i] && !vis[1][j] && !vis[2][i + j] && !vis[3][i - j + 8])
            return false;
   return true;
}
bool dfs(int idx, int d, int maxd){
   if(succeed()) return true;
   if(d == maxd) return false;
   for(int cur = idx; cur < n * m; cur++){
      int i = cur / m, j = cur % m;
      vis[0][i]++; vis[1][j]++; vis[2][i + j]++; vis[3][i - j + 8]++;
      if(dfs(idx + 1, d + 1, maxd)) return true;
      vis[0][i]--; vis[1][j]--; vis[2][i + j]--; vis[3][i - j + 8]--;
   }
   return false;
}

int main(void)
{
   int kase = 0;
   while(scanf("%d", &n) && n){
      scanf("%d", &m); getchar();
      for(int i = 0; i < n; i++){
         for(int j = 0; j < m; j++)
            G[i][j] = getchar() == 'X';
         getchar();
      }
      for(int maxd = 1; maxd <= std::min(m, n); maxd++){
         memset(vis, 0, sizeof(vis));
         if(dfs(0, 0, maxd)){
            printf("Case %d: %d\n", ++kase, maxd);
            break;
         }
      }
   }

   return 0;
}
相关推荐
dfsj6601114 分钟前
LLMs 系列科普文(14)
人工智能·深度学习·算法
薛定谔的算法33 分钟前
《盗梦空间》与JavaScript中的递归
算法
kaiaaaa1 小时前
算法训练第十一天
数据结构·算法
?!7141 小时前
算法打卡第18天
c++·算法
springfe01011 小时前
构建大顶堆
前端·算法
凌辰揽月2 小时前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen2 小时前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
jingfeng5142 小时前
数据结构排序
数据结构·算法·排序算法
能工智人小辰2 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax542120082 小时前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法