hdu1045 DFS

#include<stdio.h>
#include<string.h>
int n;
int maxx;
char map[5][5];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};

int block[16][5][5];//炮台位置

bool ok(int x,int y){
    int i,x1,y1;
    if(map[x][y]!=‘.‘)
        return false;
    for(i=0;i<4;i++){
        x1=x+dx[i];
        y1=y+dy[i];
        while(1){
            if(x1<0||x1>=n||y1<0||y1>=n||map[x1][y1]==‘X‘)//遇到边界跳出来
                break;
            else if(map[x1][y1]==‘1‘)//遇到‘X‘跳出来
                return false;
            x1+=dx[i];
            y1+=dy[i];//没有的话就沿着行和列一直找
        }
    }
    return true;
}

void dfs(int k){
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(ok(i,j)){//判断是否能放置
                map[i][j]=‘1‘;//如果能将其所在行和列标记为‘1‘,不能放置直到碰到‘X‘
                dfs(k+1);//成功放置的话就加1
                map[i][j]=‘.‘;//回溯
            }
        }
        if(maxx<k){//寻找最大数量
            maxx=k;
        }
    }
}

int main(){
    int i,j;
    while(scanf("%d",&n)!=EOF&&n){
        maxx=0;
        for(i=0;i<n;i++){
            scanf("%s",map[i]);
        }
        dfs(0);
        printf("%d\n",maxx);
    }
    return 0;
}
时间: 2024-10-07 19:54:22

hdu1045 DFS的相关文章

HDU1045 Fire Net 【DFS】

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

hdu1045 Fire Net(DFS枚举)

http://acm.hdu.edu.cn/showproblem.php?pid=1045 这是在贪心分类里面的题目,然而我第一眼看到时候还是想到了dfs,毕竟只有4*4……数据小,枚举也能AC 用DFS枚举所有状态…… #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cma

HDU1045 Fire Net(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8185    Accepted Submission(s): 4691 Problem Description Suppose that we have a squa

【HDU-1045,Fire Net-纯暴力简单DFS】

原题链接:点击! 大致题意:白块表示可以放置炮台的位置--每个炮台可以攻击到上下左右的直线上的炮台(也就是说在它的上下左右直线上不可以再放置炮台,避免引起互相攻击),黑块表示隔离墙的位置--不可放置并且可以阻挡炮火:求对于一个最大4*4的格子来说,最大的放置炮台的个数是多少. 简单分析: 简单的dfs();由于本题地图很小,不用考虑太多,尽情暴力即可.先把DFS枝干画出来,然后枝叶就用函数来具体实现. AC代码:(附注释) 1 #include <iostream> 2 #include<

解救小哈——DFS算法举例

一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二.问题的分析 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向. 在这里我们规定一

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <stack> 8 #include <cctype> 9 #include <str

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000