输入要给n*m的棋盘  均小于10   某些格子有标记  用最少的皇后  辐射到所有的标记

限时 6666ms

用IDA*    时间6000  尴尬。

#include<bits/stdc++.h>
using namespace std;
#define N 10
int n,m;
int mp[N][N];
int cnt;
int visn[N];
int vism[N];
int visx[*N]; bool dfs(int d,int maxx)
{
if(cnt==)return true;
if(d==maxx)return false;
if( (maxx-d)*( *n+m- ) <cnt )return false;//毫无用处。。 int oldmap[N][N];//一定要开到里面 一开始开到外面错了!
memcpy(oldmap,mp,sizeof mp);
int oldcnt=cnt;
for(int i=;i<=n;i++)
if(!visn[i])
for(int j=;j<=m;j++)
if(!vism[j])
{
visn[i]=vism[j]=visx[i+j]=;
for(int k=;k<=n;k++)
if(mp[k][j])cnt--,mp[k][j]=;
for(int k=;k<=m;k++)
if(mp[i][k])cnt--,mp[i][k]=;
for(int k=;k<=n;k++)
for(int s=;s<=m;s++)
{
if( (s-k)==(j-i)||(s+k)==(i+j) )
if(mp[k][s]) mp[k][s]=,cnt--;
}
if(cnt!=oldcnt)
if(dfs(d+,maxx))return true;
memcpy(mp,oldmap,sizeof mp);
cnt=oldcnt;
visn[i]=vism[j]=;
}
return false;
} int solve()
{
if(cnt==)return ;
for(int maxx=;;maxx++){
memset(visn,,sizeof visn);
memset(vism,,sizeof vism);
if(dfs(,maxx) )return maxx;
}
} int main()
{
int cas=;
while(scanf("%d",&n),n)
{ cnt=;
scanf("%d",&m);getchar();
char ch;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%c",&ch);
if(ch=='X')mp[i][j]=,cnt++;
}
getchar();
}
printf("Case %d: %d\n",++cas,solve());
}
}

每次dfs都要扫面落子的四个方位实在太费时间 真的铁脑残

应该像八皇后问题那样  设置标记数组就好了!! 900ms

#include<bits/stdc++.h>
using namespace std;
#define N 10
int n,m;
int mp[N][N];
int cnt;
int visn[N];
int vism[N];
int visx[*N];
int visy[*N]; bool judge()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]&&!visn[i]&&!vism[j]&&!visx[i+j]&&!visy[i-j+])return false; return true; } bool dfs(int d,int maxx)
{
if(judge())return true;
if(d==maxx)return false; for(int i=;i<=n;i++)
if(!visn[i])
for(int j=;j<=m;j++)
if(!vism[j])
{
visn[i]=vism[j]=;
int a=visx[i+j], b=visy[i-j+];
visx[i+j]=visy[i-j+]=; if(dfs(d+,maxx))return true;
visn[i]=vism[j]=;
visx[i+j]=a;visy[i-j+]=b;
}
return false;
} int solve()
{
if(cnt==)return ;
for(int maxx=;;maxx++){
memset(visn,,sizeof visn);
memset(vism,,sizeof vism);
memset(visx,,sizeof visx);
memset(visy,,sizeof visy);
if(dfs(,maxx) )return maxx;
}
} int main()
{
int cas=;
while(scanf("%d",&n),n)
{ cnt=;
scanf("%d",&m);getchar();
char ch;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%c",&ch);
if(ch=='X')mp[i][j]=,cnt++;
else mp[i][j]=;
}
getchar();
}
printf("Case %d: %d\n",++cas,solve());
}
}

对行数进行优化  使行数升序:90ms 可以保证没有重复 !!!  上面那个代码有很多重复

#include<bits/stdc++.h>
using namespace std;
#define N 10
#define maxn 12
int n,m;
int mp[N][N];
int cnt;
int visn[N];
int vism[N];
int visx[*N];
int visy[*N];
int maxx;
bool judge()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]&&!visn[i]&&!vism[j]&&!visx[i+j]&&!visy[i-j+])return false;
return true;
} bool dfs(int d,int raw)
{
if(judge())return true;
if(d==maxx)return false; for(int i=raw;i<=n;i++)
for(int j=;j<=m;j++)
{
int c=visn[i],d1=vism[j],a=visx[i+j], b=visy[i-j+]; visx[i+j]=visy[i-j+]=visn[i]=vism[j]=; if(dfs(d+,i+))return true; visn[i]=c,vism[j]=d1;
visx[i+j]=a;visy[i-j+]=b;
}
return false;
} int solve()
{
for( maxx=;;maxx++){
memset(visn,,sizeof visn);
memset(vism,,sizeof vism);
memset(visx,,sizeof visx);
memset(visy,,sizeof visy);
if(dfs(,) )return maxx;
}
} int main()
{
int cas=;
while(scanf("%d",&n),n)
{
scanf("%d",&m);getchar();
char ch;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%c",&ch);
if(ch=='X')mp[i][j]=;
else mp[i][j]=;
}
getchar();
}
printf("Case %d: %d\n",++cas,solve());
}
}

7-10 守卫棋盘 uva11214的更多相关文章

  1. UVA - 11214 Guarding the Chessboard(守卫棋盘)(迭代加深搜索)

    题意:输入一个n*m棋盘(n,m<10),某些格子有标记.用最少的皇后守卫(即占据或者攻击)所有带标记的格子. 分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有 ...

  2. UVA 11214 Guarding the Chessboard 守卫棋盘(迭代加深+剪枝)

    暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的. 1.最裸的暴搜 6.420s,差点超时 2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放 0.400s # ...

  3. UVA-11214 IDA*

    利用迭代加深搜索,枚举需要的皇后数量,进行搜索. 对于10 * 10 的棋盘,最多需要5个皇后就能攻击整个棋盘,当0~4个皇后都不能搜索成功,那么5就不用搜索,直接打印. AC代码: #include ...

  4. [kuangbin带你飞]专题一 简单搜索 棋盘问题

    题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...

  5. SGU 220.Little Bishops(DP)

    题意: 给一个n*n(n<=10)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution: 一眼看上去感觉是状压DP,发现状态太多,没办法存下来... 下面是一个十分巧妙的处理: ...

  6. C语言数据结构----递归的应用(八皇后问题的具体流程)

    本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...

  7. HTML页面过渡效果大全

    IE要求: 在IE5.5及以上版本的浏览器中.启用网页过渡效果 默认情况下都已经启用了,如果需要手动启用则只需在Internet选项中: Advanced(高级) - Browsing(浏览) - E ...

  8. 界面编程之QT的文件操作20180729

    /*******************************************************************************************/ 一.QT文件 ...

  9. [HAOI2015]数组游戏

    题目大意: 有一排n个格子,每个格子上都有一个白子或黑子,在上面进行游戏,规则如下: 选择一个含白子的格子x,并选择一个数k,翻转x,2x,...,kx格子上的子. 不能操作者负. 思路: 将“某个格 ...

随机推荐

  1. SXOI2018 游记

    noilinux@Capella:~$ cd /Memories/ noilinux@Capella:/Memories$ rm *SXOI* rm:是否删除有写保护的普通文件 "SXOI2 ...

  2. Postman简明教程

    一.Postman简介 Postman是一款接口测试工具,常用于日常工作的接口类功能测试和简单的自动化测试. 二.Postman功能介绍 1.常见get请求的接口测试 我们现在有这样一个获取学生信息的 ...

  3. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  4. codeforces997C Sky full of stars

    传送门:http://codeforces.com/problemset/problem/997/C [题解] 注意在把$i=0$或$j=0$分开考虑的时候,3上面的指数应该是$n(n-j)+j$ 至 ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  7. vue开发者工具vue-devtools-4.1.4_0.crx谷歌插件下载及安装

    网盘地址: https://pan.baidu.com/s/14PoaihUHQZEJtiHNWUmdjg 下载好后 谷歌浏览器中扩展程序,开启开发者模式,将下载的文件拖到窗口中即可 然后重启浏览器 ...

  8. 常见踩坑案例(二)-Request method 'POST' not supported

    一 前言 最近涉及到与前后端的数据对接,按道理来说没一点压力结果被一前端童鞋带坑里去了(不过也是很久没写过这种前后端分离进行联调的事情了,如果是一个人全套弄的话就不会出现下面问题). 二 Reques ...

  9. jQuery动态给下拉列表添加一个选项(创建DOM对象)

    使用的函数:

  10. 【API】Mysql UDF BackDoor

    1.MySQL UDF是什么 UDF是Mysql提供给用户实现自己功能的一个接口,为了使UDF机制起作用,函数必须用C或C ++编写,并且操作系统必须支持动态加载.这篇文章主要介绍UDF开发和利用的方 ...