dfs关于按钮问题(flip游戏POJ1753)以及和bfs的区别+板子
DFS深度搜索;之前一直和bfs的用法搞不太清楚;写了题才能慢慢参透吧,看了别的博客的代码,感觉能更好理解dfs在图中的应用;
这个题目的意思是一个人去救另一个人,找出最短的寻找路径;
- #include<stdio.h>
- int n,m,p,q,min=;
- int a[][],book[][];
- void dfs(int x,int y,int step)
- {
- int next[][]={
- {,},//向右走
- {,},//向下走
- {,-},//向左走
- {-,},//向上走
- };
- int tx,ty,k;
- if(x==p && y==q) //判断是否到达小哈的位置
- {
- if(step<min)
- min=step; //更新最小值
- return;
- }
- /*枚举四种走法*/
- for(k=;k<=;k++)
- {
- /*计算下一个点的坐标*/
- tx=x+next[k][];
- ty=y+next[k][];
- if(tx< || tx>n || ty< || ty>m) //判断是否越界
- continue;
- /*判断该点是否为障碍物或者已经在路径中*/
- if(a[tx][ty]== && book[tx][ty]==)
- {
- book[tx][ty]=; //标记这个点已经走过
- dfs(tx,ty,step+); //开始尝试下一个点
- book[tx][ty]=; //尝试结束,取消这个点的标记
- }
- }
- return;
- }
- int main()
- {
- int i,j,startx,starty;
- scanf("%d %d",&n,&m); //读入n和m,n为行,m为列
- /*读入迷宫*/
- for(i=;i<=n;i++)
- for(j=;j<=m;j++)
- scanf("%d",&a[i][j]);
- scanf("%d %d %d %d",&startx,&starty,&p,&q); //读入起点和终点坐标
- /*从起点开始搜索*/
- book[startx][starty]=; //标记起点已经在路径中,防止后面重复走
- dfs(startx,starty,); //第一个参数是起点的x坐标,以此类推是起点的y坐标,初始步数为0
- printf("%d",min); //输出最短步数
- return ;
- }
然后又写了POJ上叫flip game的游戏,又刷新了我的认知.....
在看了一些代码后,才知道dfs需要考虑做和不做的问题,做了之后dfs,做完恢复,不做就继续走;
- #include <stdio.h>
- #include <string>
- #include <string.h>
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const int inf=0x3f3f3f3f;
- char map[][];
- int dir[][]={{,},{,},{,-},{-,},{,}},minn;
- int judge(){
- char a=map[][];
- for(int i=;i<;++i){
- for(int j=;j<;++j){
- if(map[i][j]!=map[][])
- return ;
- }
- }
- return ;
- }
- void swap(int x,int y){
- for(int i=;i<;++i){
- int xx=dir[i][]+x;
- int yy=dir[i][]+y;
- if(xx>=||yy>=||xx<||yy<)
- continue;
- if(map[xx][yy]=='b') //变换
- map[xx][yy]='w';
- else if(map[xx][yy]=='w')
- map[xx][yy]='b';
- }
- }
- void dfs(int x,int y,int step){
- if(step>)
- return; //超过步数 ,break
- if(judge()){
- minn=minn>step?step:minn; //维护最小值
- }
- if(y>=){
- x++;
- y=;
- }
- if(x>=){
- return; //break;
- }
- for(int j=;j<;++j){
- if(j==){
- swap(x,y);//换的情况
- dfs(x,y+,step+);//按这个路子继续深搜
- swap(x,y);//恢复原状
- }
- else{
- dfs(x,y+,step); //不翻;
- }
- }
- }
- int main(void){
- minn=inf;
- for(int i=;i<;++i){
- scanf("%s",map[i]);
- }
- dfs(,,); //从起点开始搜;
- if(minn>)//步数比总棋子还多,说明不可能实现全部转换
- printf("Impossible\n");
- else{
- printf("%d\n",minn);
- }
- return ;
- }
这个代码好丑..但是复制上去就懒的删了..
和上一题差不多意思,因为一个点只会被翻一次,翻两次没有意义;
dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索出来,它运用了回溯,保存这次的位置,深入搜索,都搜索完了便回溯回来,搜下一个位置,直到把所有最深位置都搜一遍,要注意的一点是,搜索的时候有记录走过的位置,标记完后可能要改回来;
2.bfs(宽度/广度优先搜索),这个一直理解了思想,不会用,后面才会的,思想,从某点开始,走四面可以走的路,然后在从这些路,在找可以走的路,直到最先找到符合条件的,这个运用需要用到队列(queue),需要稍微掌握这个才能用bfs;
这是网上找到的dfs与bfs的区别;
贴上一个bfs的板子
- int visit[N][N]//用来记录走过的位置
- int dir[][]={,-,,,-,,,};
- struct node
- {
- int x,y,bits;//一般是点,还有步数,也可以存其他的
- };
- queue<node>v;
- void bfs1(node p)
- {
- node t,tt;
- v.push(p);
- while(!v.empty())
- {
- t=v.front();//取出最前面的
- v.pop();//删除
- if(找到符合条件的)
- {
- 做记录;
- while(!v.empty()) v.pop();//如果后面还需要用,随手清空队列
- return;
- }
- visit[t.x][t.y]=;//走过的进行标记,以免重复
- rep(i,,)//做多次查找
- {
- tt=t;
- tt.x+=dir[i][];tt.y+=dir[i][];//这里的例子是向上下左右查找的
- if(如果这个位置符合条件)
- {
- tt.bits++;//步数加一
- v.push(tt); //把它推入队列,在后面的时候就可以用了
- }
- }
- }
- }
dfs关于按钮问题(flip游戏POJ1753)以及和bfs的区别+板子的更多相关文章
- 游戏服务器和Web服务器的区别
用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别.这篇文章就是想具体的聊聊其中的区别.当然,在了解区别之间,我们先简单的了解一下Go语言本身. 1. Go语言的特点 Go语言跟其他的 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- dfs和bfs的区别
详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
- dfs+枚举,flip游戏的拓展POJ2965
POJ 2965 The Pilots Brothers' refrigerator Description The game “The Pilots Brothers: fo ...
- Flip Game poj1753
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32961 Accepted: 14407 Description Fli ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- Unity游戏暂停之Update与FixedUpdate区别
游戏暂停 示例程序 下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : Mon ...
- 深搜(DFS)与广搜(BFS)区别
最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...
随机推荐
- Big research problems (1)
1. how to measure the uncertainty of prediction model or data analysis? 2.
- 《CSS揭秘》》
1,透明边框 默认状态下,背景会延伸到边框区域的下层.这样就在半透明的黑色边框中透出了这个容器自己的纯白色背景. 谢天谢地,从w3c的背景与边框第三版开始,我们可以通过 background-clip ...
- python操作mongo实例
# coding:utf-8 """ mongo操作工具 """ from pymongo import MongoClient MONGO ...
- linux-zookeeper安装、配置
1.下载zookeeper包 (地址:https://www-eu.apache.org/dist/zookeeper/) 2.上传zookeeper包到指定位置(例如: /usr/local/sof ...
- 这里有一份热乎乎的git相关操作
文件操作 git init (添加文件): git status (查看文件状态): git diff (查看修改内容): git rm (删除文件): git add (把文件保存在暂存区): gi ...
- koa2第一天 安装koa2found 1 low severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details
安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...
- SpringMVC-时间类型转换
在上一篇SpringMVC的提交表单中,我们使用的日期为String型,可以将日期转换为Date型,然后使用initBinder函数进行显示,具体代码如下: (1)首先更改User.java的birt ...
- 【正确使用vim编辑器的姿势】
"vi:可视化接口(Visual Interface) vim:是vi的增强版(vi iMprove) vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中 ...
- 在java中使用FFmpeg处理视频与音频
FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类. 一.首先,让我们来认识一下FFmpeg在Dos界面的常见操作 1.拷贝视频,并指定新的视频的名字以及格式 ffmpeg ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...