Num 36 : ZOJ 2100 [ 深度优先搜索算法 ] [ 回溯 ]

该题是用回溯法来解决的题:

题目:

Seeding


Time Limit: 2 Seconds     
Memory Limit: 65536 KB


It is spring time and farmers have to plant seeds in the field. Tom has a nice field,which is a rectangle with n * m squares. There are big stones in some of the squares.

Tom has a seeding-machine. At the beginning, the machine lies in the top left corner of the field. After the machine finishes one square, Tom drives it into an adjacent square, and continues seeding. In order to protect the machine,
Tom will not drive it into a square that contains stones. It is not allowed to drive the machine into a square that been seeded before, either.

Tom wants to seed all the squares that do not contain stones. Is it possible?

Input

The first line of each test case contains two integers n and m that denote the size of the field. (1 < n, m < 7) The next n lines give the field, each of which contains m characters. ‘S‘ is a square with stones, and ‘.‘ is a
square without stones.

Input is terminated with two 0‘s. This case is not to be processed.

Output

For each test case, print "YES" if Tom can make it, or "NO" otherwise.

Sample Input

4 4

.S..

.S..

....

....

4 4

....

...S

....

...S

0 0

Sample Output

YES

NO

题目大意:

从左上角開始行进,能不能不走回头路的把地图上全部点走一遍;( S代表障碍物 )。

题目分析:

从左上角開始,利用回溯法进行深搜。推断有没有一种情况。能不回头的把一条路走完;

AC代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int x,y,m,n,snum,max=0,flag;
char map[10][10];
void fun(int x,int y)
{
	if(x<1||x>m||y<1||y>n) return;
    if(map[x][y]==‘S‘) return;
    if(flag==1) return;
	map[x][y]=‘S‘;
	snum++;
	if(snum==m*n)
    {
    	flag=1;
    	return;
    }
	fun(x-1,y);
	fun(x+1,y);
	fun(x,y-1);
	fun(x,y+1);
	snum--;
	map[x][y]=‘.‘;
}
int main()
{
	int i,j;
	while(scanf("%d%d",&m,&n),m|n)
	{
		snum=0;
		for(i=1;	i<=m;	i++)
			for(j=1;	j<=n;	j++)
			{
				scanf(" %c",&map[i][j]);
				if(map[i][j]==‘S‘) snum++;
			}
		flag=0;
		fun(1,1);
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
时间: 2024-11-15 00:35:59

Num 36 : ZOJ 2100 [ 深度优先搜索算法 ] [ 回溯 ]的相关文章

深度优先搜索算法(DFS)以及leetCode的subsets II

深度优先搜索算法(depth first search),是一个典型的图论算法.所遵循的搜索策略是尽可能“深”地去搜索一个图. 算法思想是: 对于新发现的顶点v,如果它有以点v为起点的未探测的边,则沿此边继续探测下去.当顶点v的所有边都已被探寻结束,则回溯到到达点v的先辈节点.以相同方法一直回溯到源节点为止.如果图中还有未被发现的顶点,则选择其中一个作为源顶点,重复以上的过程.最后的结果是一些不相交的深度优先树. leetCode中的应用: Given a collection of integ

图的深度优先搜索算法DFS

1.问题描述与理解 深度优先搜索(Depth First Search,DFS)所遵循的策略,如同其名称所云,是在图中尽可能"更深"地进行搜索.在深度优先搜索中,对最新发现的顶点v若此顶点尚有未探索过从其出发的边就探索之.当v的所有边都被探索过,搜索"回溯"到从其出发发现顶点v的顶点.此过程继续直至发现所有从源点可达的顶点.若图中还有未发现的顶点,则以其中之一为新的源点重复搜索,直至所有的顶点都被发现.与BFS中源顶点是指定的稍有不同. DFS搜索轨迹Gπ将形成一片

深度优先搜索算法

一.深度优先搜索 深度优先搜索算法(Depth First Search),是图论中的经典算法. 深度优先搜索算法是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当结点所有子结点那一层都被搜索过,再回溯返回到当前结点的邻结点,继续搜索,直到遍历完整棵树.一般采用的是前序遍历,先根然后再左右结点的方式进行. 任何DFS只需要通过下面几步就可以实现,无论是递归还是非递归方式.我给这几步分别做了一个命名,分别是find.forward.done.back. 如下: 1.find(right):在树

深度优先搜索算法的概念

深度优先搜索算法的概念 与广度优先搜索算法不同,深度优先搜索算法类似与树的先序遍历.这种搜索算法所遵循的搜索策略是尽可能"深"地搜索一个图.它的基本思想如下:首先访问图中某一个起始顶点v,然后由v出发,访问与v相邻且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,-.重复上述过程.当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止(还是举相同的例子,从你开始遍历你的所有亲戚,例如

广度优先、深度优先搜索算法——面试题

广度优先搜索(Breadth-first Search) BFS在求解最短路径或者最短步数上有很多的应用.应用最多的是在走迷宫上. 分析 树的定义本身就是一种递归定义,因此对于树相关的算法题,递归是最好的解决思路(在递归深度允许的情况下). 递归版 public class Solution { public boolean isSymmetric(TreeNode root) { return root==null||isMirror(root.left,root.right); } priv

广度/深度优先搜索算法 - python实现

1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一个节点可能与众多节点直接相连,这些节点被称为邻居. 如二叉树就为一个简单的图: 更加详细的信息可参见:https://www.cnblogs.com/polly333/p/4760275.html 2. 算法 1). 广度优先搜索: 广度优先搜索算法(Breadth First Search,BSF

Leetcode之深度优先搜索&amp;回溯专题-679. 24 点游戏(24 Game)

深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) * (7-1) = 24 示例 2: 输入: [1, 2, 1, 2] 输出: False 注意: 除法运算符 / 表示实数除法,而不是整数除法.例如 4 / (1 - 2/3) = 12 . 每个运算符对两个数进行运算.特别是我们不能用 - 作为一元运算符.例如,[1, 1

POJ2488 深度优先搜索+回溯

POJ2488 题目 骑士按照下图所示的走法对棋盘进行巡逻,每个格子只允许巡逻一次,且必须巡逻所有格子.给定棋盘的行数p和列数q,输出一条骑士巡逻路径,若不存在这样一条路径,则输出impossible. 图1 骑士的8种走法 骑士巡逻问题的简化版本,是哈密顿路径问题的特殊形式,但是是线性时间内可以解决的\(^{[1]}\). Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenario #2: impossible Scena

深度优先搜索算法基础模板

1 void DFS(检索状态) 2 { 3 if(到达目标状态) 4 { 5 ...// 根据题意添加 6 return; 7 } 8 9 if(越界或是不合法状态) return; 10 11 for(扩展方式) 12 { 13 if(扩展方式所达到状态合法) 14 { 15 ....//根据题意来添加 16 标记; 17 DFS(); // 递归调用 18 修改(剪枝); 19 还原标记; 20 //是否还原标记根据题意 21 //如果加上(还原标记)就是 回溯法 22 } 23 } 24