题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1045

题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个O。

解题思路

题目规模比较小(4*4),可以DFS解决。

对于一个点,要么放,要么不放。

放的话条件必须是上下左右四个方向扫到边界且不首先碰到X。

可以只对放的点进行标记,而对于不放的点不进行标记,这样当dep>n*n的时候及时return就行了。

注意每次dfs只需要按顺序考虑一个点,而不要同时对整个棋盘所有非X点同时dfs,否则就爆了。

原因是,每次只关联一个点,其它点都是不关联的,如果dfs等于做了大量重复计算。

#include "cstdio"
#include "string"
#include "cstring"
#include "iostream"
using namespace std;
int n,vis[][],ans;
char map[][];
struct status
{
int x,y;
char type;
status(int x,int y,char type):x(x),y(y),type(type) {}
status() {}
}P[];
bool judge(int X,int Y)
{
if(map[X][Y]=='X') return false;
for(int i=X-; i>=&&map[i][Y]!='X'; i--) if(vis[i][Y]) return false;
for(int i=X+; i<=n&&map[i][Y]!='X'; i++) if(vis[i][Y]) return false;
for(int i=Y-; i>=&&map[X][i]!='X'; i--) if(vis[X][i]) return false;
for(int i=Y+; i<=n&&map[X][i]!='X'; i++) if(vis[X][i]) return false;
return true;
}
void dfs(int p,int s)
{
if(p>n*n) {ans=max(ans,s);return;}
dfs(p+,s);
vis[P[p].x][P[p].y]=true;
if(judge(P[p].x,P[p].y)) dfs(p+,s+);
vis[P[p].x][P[p].y]=false; }
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
string tt;
while(cin>>n&&n)
{
memset(vis,,sizeof(vis));
int cnt=;ans=;
for(int i=;i<=n;i++)
{
cin>>tt;
for(int j=;j<tt.size();j++)
{
P[++cnt]=status(i,j+,tt[j]);
map[i][j+]=tt[j];
}
}
dfs(,);
cout<<ans<<endl;
}
}
11909497 2014-10-19 11:59:35 Accepted 1045 0MS 292K 1335 B C++ Physcal

HDU 1045 (DFS搜索)的更多相关文章

  1. HDU 1241 (DFS搜索+染色)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目大意:求一张地图里的连通块.注意可以斜着连通. 解题思路: 八个方向dfs一遍,一边df ...

  2. HDU 1010 (DFS搜索+奇偶剪枝)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...

  3. hdu 1010 dfs搜索

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. HDU 1045 dfs + 回溯

    题目链接:http://acm.hrbust.edu.cn/vj/index.php?/vj/index.php?c=&c=contest-contest&cid=134#proble ...

  5. HDU 1045 dfs

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  7. HDU 1312:Red and Black(DFS搜索)

      HDU 1312:Red and Black Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & ...

  8. hdu 1312:Red and Black(DFS搜索,入门题)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. hdu 1045 Fire Net(最小覆盖点+构图(缩点))

    http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB   ...

随机推荐

  1. HDU 1285 拓普排序 基本模板例题 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. A desmos graph supersampling test

  3. PHP 的__call()

    PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法.如果你试着调用一个对象中不存在或被权限控制中的方法,__call 方法将会被自动调用. 例七:__call ...

  4. CStringUtf8ToUnicode

    CString CStringUtf8ToUnicode( CString Utf8 ) { int wLen = 0; CString strUnicode; LPSTR pBufChar = NU ...

  5. codeforces 478B Random Teams 解题报告

    题目链接:http://codeforces.com/problemset/problem/478/B 题目意思:有 n 个人,需要将这班人分成 m 个 组,每个组至少含有一个人,同一个组里的人两两可 ...

  6. 用jquery追加的元素不能触发treeview事件

    在追加的元素后面添加: $("#navigation").treeview({ persist: "location", collapsed: true, un ...

  7. java读取本地properties文件

    package cn.edu.hbcf.pojo; import java.io.FileNotFoundException; import java.io.IOException; import j ...

  8. mybatis的insert简单使用

  9. C语言字符串处理

    一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a;                     //显然是正确的,p="abcd";   ...

  10. 分类and分类延展

    1.Category简介 Category,又称为类别&类目&分类,是OC特有语法,在不修改原有类的基础上增加新的方法,一个庞大的类可以多人来分模块开发,有助于团队合作,或者对当前类方 ...