`

poj 1321搜索的问题(DFS,回溯)

 
阅读更多

题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

Input

输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n

当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

Output

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

 

思路:这题只需要深搜,每次从上一个放棋子地方的下一行开始寻找可以放棋子的地方,当发现该点时,记录行数,并更新棋盘,将于此点同行同列的都更新为'.',如果找不到,则返回,当把所有棋子都放上去的时候,则找到一个接,计数+1,就这样进行搜索,可以保证AC。由于题意中明确的提出C<2^31,这样int类型就能满足,设计时就不用考虑这个数据类型了!
代码如下:
#include<iostream>
using namespace std;
const int Max = 10;



bool board[Max][Max], row[Max], col[Max];  // row[i],col[j]分别记录第i行,第j列被访问了没有。
int len, num, ans;



void dfs(int depth, int start_line)
{
    if(depth == num)
	{
        ans ++;
        return;
    }
    for(int i = start_line + 1; i <= len; i ++)
        for(int j = 1; j <= len; j ++)
            if(board[i][j] == true && row[i] == false && col[j] == false)
			{
                row[i] = true;  
				col[j] = true;
                dfs(depth + 1, i);
                row[i] = false;  
				col[j] = false;
            }
}



int main()
{
    int i, j;
    char c;
	
    while(1)
	{
        cin >> len >> num;

        if(len == -1 && num == -1) 
			break;
        memset(board, false, sizeof(board));
        for(i = 1; i <= len; i ++)
            for(j = 1; j <= len; j ++)
			{
                cin >> c;
                if(c == '#')
                    board[i][j] = true;
            }
			
			ans = 0;
			memset(row, false, sizeof(row));
			memset(col, false, sizeof(col));
			int start_line = len - num + 1; // 第一颗棋子的位置可能在 1 ~ start_line 行之间。
			for(i = 1; i <= start_line; i ++)
				for(j = 1; j <= len; j ++)
					if(board[i][j] == true)
					{
						row[i] = true;  
						col[j] = true;
						dfs(1, i);
						row[i] = false;  
						col[j] = false;
					}
					cout << ans << endl;
	}
	return 0;
}
 关于代码中的回溯问题,现在说实在的不能理解啊~!真的想了好久,还是不懂!要向别人去请教一下才能懂!!

分享到:
评论

相关推荐

    POJ1321棋盘问题

    "POJ1321棋盘问题" ...POJ1321棋盘问题是一种经典的回溯法问题,通过使用DFS深度搜索和回溯法可以解决该问题。该问题可以帮助我们更好地理解回溯法和DFS算法,并且可以应用于解决其他类似的 Problem。

    POJ1321-Chess Problem

    2. **深度优先搜索(DFS)** 或 **广度优先搜索(BFS)**:在处理棋盘游戏时,这些搜索策略常用于探索所有可能的棋步或状态。 3. **动态规划(DP)**:对于某些复杂问题,可能需要通过动态规划来找到最优解,例如计算最少...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、向量(Vector)操作、回溯法以及剪枝策略的掌握程度。本题的解决方案...

    POJ1020-Anniversary Cake【有技巧的DFS】

    【标题】"POJ1020-Anniversary Cake【有技巧的DFS】"是一个源自北京大学在线编程平台POJ的编程题目,它涉及到深度优先搜索(DFS)算法的应用。这道题目要求参赛者通过编程解决一个有趣的问题,即在特定条件下如何...

    POJ3373-Changing Digits【DFS+强剪枝】

    标题“POJ3373-Changing Digits【DFS+强剪枝】”涉及的是一个编程竞赛中的问题,这个问题在北大POJ(北京大学在线评测系统)平台上被提出。"Changing Digits"是一个算法挑战,而解决方案是通过深度优先搜索(DFS)...

    POJ1014-Dividing【DFS】【多重背包+二进制优化】

    这里的关键词是“DFS”(深度优先搜索)、“多重背包”和“二进制优化”,这些都是解决此类问题的关键技术。 深度优先搜索(DFS)是一种在图或树结构中探索所有可能路径的算法。在这个问题中,DFS可能是用来遍历...

    POJ3733-Changing Digits【DFS+强剪枝】

    【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...

    图的深搜+回溯练习题:POJ2197

    标题中的“图的深搜+回溯练习题:POJ2197”是指一个编程题目,主要涉及图论中的深度优先搜索(DFS, Depth First Search)和回溯算法的应用。这个题目来源于在线编程竞赛平台POJ(Problem Online Judge),编号为2197...

    回溯法处理骑士游历问题

    dfs中的回溯法,poj2488骑士游历,主要是回溯要将所有的点都遍历到。

    poj2488.rar_poj24_poj2488_方向模板法

    标题中的“poj2488.rar_poj24_poj2488_方向模板...综上所述,解决POJ2488问题的关键在于理解和运用回溯法,特别是深度优先搜索过程中的方向控制。通过分析提供的代码,我们可以深入学习如何在实际编程中实施这些概念。

    POJ2676-Sudoku

    2. **深度优先搜索(DFS)**:一种常见的解决数独问题的算法是深度优先搜索。从第一个空白单元格开始,尝试填充1到9的数字,如果在某一步无法进行(即违反了数独规则),则回溯到上一步,尝试下一个数字。 3. **...

    POJ1696-Space Ant

    DFS用于遍历或搜索树或图,从一个节点开始,沿着某条路径深入探索,直到达到最深处,然后回溯到未完全探索的节点继续进行。 3. **状态转移**:蚂蚁在空间中移动可能涉及到状态的转换,比如蚂蚁从一个节点移动到另一...

    强大的poj分类

    常用的搜索算法有深度优先搜索(DFS)、广度优先搜索(BFS)、贪心算法、回溯算法等。 **重要性**:搜索算法是解决许多复杂问题的有效手段。例如,在游戏AI、路径规划等领域有着广泛的应用。 **示例题目**: - POJ...

    POJ 1077 算法

    这是一个典型的图搜索问题,常见的解决方法包括深度优先搜索(DFS)、广度优先搜索(BFS)以及A*搜索算法。 在八数码问题中,我们需要定义数据结构来表示当前的状态,通常是一个9个元素的一维数组,其中0代表空白...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    解决这个问题通常采用深度优先搜索(DFS)或广度优先搜索(BFS),同时维护两个数组,分别记录边的最小度和边的出现顺序,以此来判断边是否为桥。 2. poj1150 "Gardening"(园艺) 这个题目要求你在一块矩形土地上...

    POJ 100题代码

    可以采用回溯法或深度优先搜索(DFS)策略,结合递归实现全排列的生成。 6. 题目1040《Tic Tac Toe》:此题是关于井字游戏的判断,考察博弈论和状态空间搜索。通过分析游戏状态并使用深度优先搜索或最小最大搜索...

    POJ2488-A Knight's Journey【骑士游历】

    3. **深度优先搜索(DFS)**:在解决这类问题时,通常采用深度优先搜索策略。从一个节点出发,尽可能深地探索图的分支,直到无法再进一步,然后回溯到前一个节点,尝试其他路径。DFS可以有效地处理图的遍历问题。 4...

    PKU_poj 1001~1009

    可能涉及的经典算法有分治策略、贪心算法、回溯法、动态规划、图算法(如DFS、BFS、最短路径算法)等。每个子文件中的代码都是对特定问题的算法实现。 4. 数据结构:有效的数据结构是解决问题的关键。常见数据结构...

    POJ_keptsl6_C++_

    深度优先搜索(Deep First Search, DFS)和广度优先搜索(Breadth First Search, BFS)是图论和树结构中常见的搜索策略,DFS常用于遍历或搜索树或图,而BFS则用于寻找最短路径等问题。 现在,让我们逐个分析压缩包中的...

    本人整理的POJ解题报告大全

    2. **搜索算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS),在解决迷宫问题、树遍历和图遍历问题时非常有用。 3. **图论算法**:如最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)...

Global site tag (gtag.js) - Google Analytics