本题题意:

输入一个n*m的棋盘,某些格子有标记,用最少的皇后占据或者攻击所以带标记的格子。皇后的攻击范围为同行同列和同对角线。

可以使用IDA*算法,即从样例可以发现只需要最多5个棋子就可以对棋盘上所有地方进行攻击,因而使用IDA*进行对应的剪枝即可。

#include<cstdio>
#include<cstring>
using namespace std; int n,m,kase=,maxd;
bool vis[][];///表示皇后已经攻击的范围,vis[0][]中存储的是行,vis[1][]中存储的是每列,vis[2][]中存储的是每个副对角线,vis[3][]是每个主对角线
char chess[][]; bool dfs(int pos,int r)
{
if(pos==maxd){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(chess[i][j]=='X'&&!vis[][i]&&!vis[][j]&&!vis[][i+j]&&!vis[][i-j+n])///如果达到最大深度,但是仍有X点不处于皇后的攻击范围内,则剪枝
return false;
}
return true;
}
for(int i=r;i<=n;i++)///从当前行开始,因为前面的行已经搜索过
for(int j=;j<=m;j++){
if(!vis[][i]||!vis[][j]||!vis[][i+j]||!vis[][i-j+n]){///若存在有未被攻击的地方,则进行放棋
bool v1=vis[][i],v2=vis[][j],v3=vis[][i+j],v4=vis[][i-j+n];
vis[][i]=vis[][j]=vis[][i+j]=vis[][i-j+n]=true;
if(dfs(pos+,r+)) return true;///若要放置棋子数最小,则皇后必定会放于是X的位置
vis[][i]=v1,vis[][j]=v2,vis[][i+j]=v3,vis[][i-j+n]=v4;///还原
}
}
return false;
} int main()
{
while(~scanf("%d%d",&n,&m)&&n)
{
for(int i=;i<=n;i++) scanf("%s",chess[i]+);
for(maxd=;maxd<;maxd++)
{
memset(vis,,sizeof(vis));
if(dfs(,)) break;
}
printf("Case %d: %d\n",++kase,maxd);
}
return ;
}

最新文章

  1. CocoaPods pod 安装、更新慢解决方法
  2. android手机两种方式获取IP地址
  3. 干净的停止tomcat/java应用程序
  4. [NOIP2011] 提高组 洛谷P1311 选择客栈
  5. php--validate表单验证
  6. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)
  7. maven小项目注册服务(一)--email和persist模块
  8. Codeforces Round #330 (Div. 1) A. Warrior and Archer 贪心 数学
  9. iOS之XIB拖拽scrollView
  10. Qt中暂停线程的执行(利用QMutex,超级简单明了)
  11. (转)iPhone 判断UITableView 滚动到底部
  12. MaxSubArray 最大子数列和
  13. 一键搭键php网站环境的系统
  14. GridView 编辑,更新,删除 等操作~~
  15. C# 判断网站是否能访问或者断链
  16. DS4700电池更换步骤
  17. Dynamics CRM 2011/2013 section的隐藏
  18. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法
  19. 51nod 1387 移数字
  20. Spring 3 Java Based Configuration with @Value

热门文章

  1. vm安装diagram
  2. Object转Integer,String
  3. where的顺序对运行的影响--无影响
  4. mongdb使用
  5. 如何使用VSTO自动将Excel中的图表复制到Word
  6. 【PyImageSearch】Ubuntu16.04使用OpenCV3.3.0实现图像分类
  7. 内存布局:栈,堆,BSS段(静态区),代码段,数据段
  8. 16位GUID
  9. leetcode57:插入区间
  10. php优秀框架codeigniter学习系列——constants.php