HDU 1045 (DFS搜索)

题目链接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[5][5],ans;
char map[5][5];
struct status
{
    int x,y;
    char type;
    status(int x,int y,char type):x(x),y(y),type(type) {}
    status() {}
}P[20];
bool judge(int X,int Y)
{
    if(map[X][Y]==‘X‘) return false;
    for(int i=X-1; i>=1&&map[i][Y]!=‘X‘; i--)  if(vis[i][Y]) return false;
    for(int i=X+1; i<=n&&map[i][Y]!=‘X‘; i++) if(vis[i][Y]) return false;
    for(int i=Y-1; i>=1&&map[X][i]!=‘X‘; i--) if(vis[X][i]) return false;
    for(int i=Y+1; 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+1,s);
    vis[P[p].x][P[p].y]=true;
    if(judge(P[p].x,P[p].y)) dfs(p+1,s+1);
    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,0,sizeof(vis));
        int cnt=0;ans=0;
        for(int i=1;i<=n;i++)
        {
            cin>>tt;
            for(int j=0;j<tt.size();j++)
            {
                P[++cnt]=status(i,j+1,tt[j]);
                map[i][j+1]=tt[j];
            }
        }
        dfs(1,0);
        cout<<ans<<endl;
    }
}
11909497 2014-10-19 11:59:35 Accepted 1045 0MS 292K 1335 B C++ Physcal
时间: 2024-10-22 06:46:16

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

HDU 1045 DFS暴搜

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6229    Accepted Submission(s): 3506 Problem Description Suppose that we have a square city with straight streets. A map of a city is a s

HDU 1045 dfs

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11742    Accepted Submission(s): 7048 Problem Description Suppose that we have a square city with straight streets. A map of a city is a

hdu 1010 dfs搜索

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 107138    Accepted Submission(s): 29131 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

hdu 1518 Square (dfs搜索可参考poj1011)

Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8589    Accepted Submission(s): 2784 Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end

HDU 1312:Red and Black(DFS搜索)

HDU 1312:Red and Black Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From

HDU 1045 - Fire Net (最大独立集)

题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝.最后取可以放置的最大值. 这里我转化成求最大独立集来做. 首先将每个空地编号,对于每个空地,与该位置可以攻击到的空地连边.找最多的空地使得不互相攻击,即求该图的最大独立集.与搜索做法基本一致,但是说法略有不同. 1 #include<iostream> 2 #include<cstring

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

http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1045 Description Suppose that we have a square city with straight streets. A map of a city

Fire Net HDU 1045

简单深搜,可以完全暴力,不会超时的. #include<iostream> #include<cstring> #include<cmath> using namespace std; #define MAX(a,b) (a>b?a:b) char maze[10][10]; int n, maxn; void DFS(int step,int count); int cheak(int x, int y); int main() { int i; while(s

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <