uva639 回溯

//
//  main.cpp
//  639
//
//  Created by Fangpin on 15/3/9.
//  Copyright (c) 2015年 FangPin. All rights reserved.
//

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
int map[7][7];
int ans,n;
void dfs(int x,int y,int sum){
    if(!map[x][y]){
        ++y;
        if(y==n+1) {y=1;++x;}
        if(x<=n)
            dfs(x,y,sum);
    }
    else{
        int c1=0,c2=0,i=x,j=y;
        while(map[i][j]){
            if(map[i][j]==2) ++c1;
            ++i;
        }
        i=x;j=y;
        while(map[i][j]){
            if(map[i][j]==2) ++c1;
            --i;
        }
        i=x;j=y;
        while(map[i][j]){
            if(map[i][j]==2) ++c2;
            ++j;
        }
        i=x;j=y;
        while(map[i][j]){
            if(map[i][j]==2) ++c2;
            --j;
        }
        if(c1 || c2){
            ++y;
            if(y==n+1) {y=1;++x;}
            if(x<=n)
                dfs(x,y,sum);
        }
        else{
            ++sum;
            ans=max(ans,sum);
            int i=x,j=y;
            ++y;
            if(y==n+1) {y=1;++x;}
            if(x<=n){
                map[i][j]=2;
                dfs(x,y,sum);
                --sum;
                map[i][j]=1;
                dfs(x,y,sum);
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    while(scanf("%d",&n),n){
        memset(map,0,sizeof(map));
        string s;
        for(int i=1;i<=n;++i){
            cin>>s;
            for(int j=0;j<s.size();++j){
                if(s[j]=='.')
                    map[i][j+1]=1;
                else map[i][j+1]=0;
            }
        }
        ans=0;
        dfs(1,1,0);
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-10-13 04:40:32

uva639 回溯的相关文章

uva639 暴力、回溯

题意: 在象棋中,“车”是可以在棋盘上沿着纵向或横向走任意格子的棋子. 在这个问题中,我们假设有一个4*4的小棋盘, 在这个棋盘上面包含着“墙”,而“车”是不能越过墙的.而我们的目标就是尽可能地放置更多地“车”到这个棋盘上去,使所有 的这些”车“互相不能吃到其它棋子. 在上面几副图中给出了几个样例, 棋盘上,格子全部是黑色的代表是“墙”, 黑色圆形的代表是“车”. 其中第二,三副图的棋子的放置是正确的,第四,五副图的棋子是错误的,因为那两个棋子可以互相吃到对方. 1 #include <cstd

五大常用算法之四:回溯法

(转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html) 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 许

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

hdu4739(回溯)

题意: 给出宝藏个数,然后给出每个宝藏的位置: 如果四个宝藏构成正方形就能取走: 问最多取走几个: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 25; int n, ans; int cnt[105][105]; struct node { int x; int y; bool operator<(node a) const {

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能性.即避免不必要的搜索.这种方

回溯法——求解N皇后问题

问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上.可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行.同一列或同一斜线上. 问题分析 我们以最简单的4皇后问题分析,显然,为了使皇后不相互攻击,首先考虑每一行只能放一个皇后,我们以X[1,2,3-.N]代表此问题的解数组,X[N]代表在第N行第X[N]列放了一个皇后,例如,X[2

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se

栈回溯技术

转载于:http://blog.csdn.net/yangzhiloveyou/article/details/9042137 1.    前言 段错误.非法地址访问等问题导致程序崩溃的现象屡屡发生,如果能找到发生错误的函数,往往一眼就能看出BUG所在--对于这类比较简单的问题,比如使用空指针进行读写等,利用栈回溯技术可以很快定位.但是对于数组溢出.内存泄漏等问题导致的程序错误,往往隐藏很深,它们并不当场发作,即使我们一步一步跟踪到发生错误的语句时,也经常会让人觉得"这个地方根本不可能出错啊&q