深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种。

题目:POJ2386 

思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者真值什么的),最后遍历一遍地图就好了。
 /*
 input:
 7 7
 ..#.#..
 ..#.#..
 ###.###
 ...@...
 ###.###
 ..#.#..
 ..#.#..         表示有13个可以走到的地方(包括原来那一格)。*/

 #include <stdio.h>
 ][];
 void solve(int H,int W);
 void find1(int H,int W);
 void dfs(int x,int y,int H,int W);
 int main()
 {
     int H,W,i;
     &&W!=)
     {
         getchar();
      ;i<H;i++)
         gets(ch[i]);
      find1(H,W);
      solve(H,W);
     }
     ;
 }

 void solve(int H,int W)
 {
     ;
     ;i<H;i++)
         ;k<W;k++)
             if(ch[i][k]=='@')
                 a++;
      printf("%d\n",a);
 }

 void find1(int H,int W)
 {
     ;i<H;i++)
         ;k<W;k++)
             if(ch[i][k]=='@')
                 {
                     dfs(i,k,H,W);
                     return;
                 }
 }

 void dfs(int x,int y,int H,int W)
 {
     int x1,y1,nx,ny;
     ch[x][y]='@';
     ;x1<=;x1++)
     {
         nx=x+x1;
             &&nx<H&&ch[nx][y]!='#'&&ch[nx][y]!='@')
                 dfs(nx,y,H,W);
     }
     ;y1<=;y1++)
     {
         ny=y+y1;
             &&ny<W&&ch[x][ny]!='#'&&ch[x][ny]!='@')
                 dfs(x,ny,H,W);
     }
     return;
 }

POJ2386

练习题系列………………………………………………………

 #include <stdio.h>
 ][];
 void solve(int H,int W);
 void find1(int H,int W);
 void dfs(int x,int y,int H,int W);
 int main()
 {
     int H,W,i;
     &&W!=)
     {
         getchar();
      ;i<H;i++)
         gets(ch[i]);
      find1(H,W);
      solve(H,W);
     }
     ;
 }

 void solve(int H,int W)//计数
 {
     ;
     ;i<H;i++)
         ;k<W;k++)
             if(ch[i][k]=='@')
                 a++;
      printf("%d\n",a);
 }

 void find1(int H,int W)//找到点
 {
     ;i<H;i++)
         ;k<W;k++)
             if(ch[i][k]=='@')
                 {
                     dfs(i,k,H,W);
                     return;
                 }
 }

 void dfs(int x,int y,int H,int W)
 {
     int x1,y1,nx,ny;
     ch[x][y]='@';
     ;x1<=;x1++)
     {
         nx=x+x1;
             &&nx<H&&ch[nx][y]!='#'&&ch[nx][y]!='@')
                 dfs(nx,y,H,W);
     }
     ;y1<=;y1++)
     {
         ny=y+y1;
             &&ny<W&&ch[x][ny]!='#'&&ch[x][ny]!='@')
                 dfs(x,ny,H,W);
     }
     return;
 }

POJ1979

 题目:AOJ0033 中文 

 #include <stdio.h>
 #include <iostream>
 using namespace std;
 ][];
 ]={,,,-};
 ]={,,-,};
 int H,W,cou;
 void DFS(int x, int y){
     ;
     char b=ch[x][y];
     ch[x][y]='.';
     ; i < ; i++)
     {
         int xn = x + xx[i], yn = y + yy[i];
          && xn < W && yn >=  && yn < H && ch[xn][yn] == b)
         {
             DFS(xn, yn);
         }
     }
     return ;
 }

 int main()
 {
     while(cin >> W >> H && (H && W))
     {
         cou = ;
         ; i < W; i++)
             ; k < H; k++)
             cin >> ch[i][k];
         ; i < W; i++)
                 ; k < H; k++)
                     if(ch[i][k] != '.')
                     {
                         DFS(i, k);
                         cou++;
                     }
         cout << cou << endl;
     }
     ;
 }

AOJ0033

题目:POJ3009

这题撸了很久。

 #include <iostream>
 #include <string.h>
 #include <algorithm>
 using namespace std;
 ]={ , , -, };
 ]={ , , , -};
 ][];
 int xn,yn,x1,y1,H,W,y2,x2,a;
 void dfs(int x1, int y1, int step){
     ) return ;
     ; i < ; i++){//四个方向
         int xn = x1 + dx[i], yn = y1 + dy[i];
         if(xn == x2 && yn == y2){
             a=min(a, step + );
             continue;
         }
         )continue;
          && xn < W && yn >=  && yn < H){
                 xn += dx[i]; yn += dy[i];//继续往下面走
              && xn < W && yn >=  && yn < H)
             {
                 ) continue;//直到撞墙或终点
                 if(xn == x2 && yn == y2){//到达终点
                     a= min(a, step + );
                     return ;
                 }
                 map1[xn][yn] = ;//停下来了,继续dfs,注意dfs前后面的墙。
                 dfs(xn - dx[i], yn - dy[i], step + );
                 map1[xn][yn] = ;
                 break;
             }
         }
     }
 return ;
 }

 int main()
 {
      && W != ){
      ; i < W; i++)
         ; k < H; k++){
             cin >> map1[i][k];
             ){
                 x1 = i; y1 = k;
                 map1[i][k] = ;
             }
             ){
                 x2 = i;
                 y2 = k;
                 map1[i][k] = ;
             }
         }
         a = ;
         dfs(x1, y1, );
          || a>) cout << "-1" << endl;
         else cout << a <<endl;
     }
     ;
 }

POJ3009

挑战程序2.1.4 穷竭搜索>>深度优先搜索的更多相关文章

  1. 挑战程序2.1.5 穷竭搜索>>宽度优先搜索

    先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到 ...

  2. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  3. 搜索——深度优先搜索(DFS)

    设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个 ...

  4. 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索

    骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...

  5. python实现广度优先搜索和深度优先搜索

    图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...

  6. 《挑战程序设计竞赛》2.1 穷竭搜索 POJ2718 POJ3187 POJ3050 AOJ0525

    POJ2718 Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6509   Acce ...

  7. 《挑战程序设计竞赛》2.1 深度优先搜索 POJ2386 POJ1979 AOJ0118 AOJ0033 POJ3009

    POJ2386 Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25366   Accepted: ...

  8. matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  9. 深度优先搜索(dfs)与出题感想

    在3月23号的广度优先搜索(bfs)博客里,我有提到写一篇深搜博客,今天来把这个坑填上. 第一部分:深度优先搜索(dfs) 以上来自百度百科. 简单来说,深度优先搜索算法就是——穷举法,即枚举所有情况 ...

随机推荐

  1. status bar、navigationBar、tableView吸顶view设置

    1. 隐藏navigationBar self.navigationController.navigationBar.hidden = YES; 2. status bar设置 -(void)view ...

  2. 【译】SQL Server索引进阶第八篇:唯一索引

    原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...

  3. MSSQL 全表搜索 指定字符串

    平时在在MSSql中查询数据的时候,想查找,某个字段在数据库中是否存在,并且查询出在哪个表中,哪个字段下面,在不知道的情况下,操作起来会很麻烦,然后就写了一个sql语句,使用起来感觉挺方便的.当然了, ...

  4. Docker version 1.12.5建立registry私库

    sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry :前面的是宿主机的地址(/opt/da ...

  5. Android 基于Android的手机邮件收发(JavaMail)之一(准备工作)

    界面一共是五个界面,分别是welcomeActivity,ReceiveAndSendActivity,ReceiveListActivity,SendMailActivity,MailDetails ...

  6. windows下Bat命令学习

    一.基础语法:1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令.可以使用任何文本文件编辑工具创建和修改.2.批处理是一种简单的程序,可以用 if 和 goto 来控制 ...

  7. poj 3262 Protecting the Flowers

    http://poj.org/problem?id=3262 Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Tota ...

  8. android nfc中MifareClassic格式的读写

    Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-dat ...

  9. redis 五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  10. Struts2下载文件点取消出现的异常解决

    struts2点击下载,如果正常下载不会报错,可是如果点击取消就会报如下的错误: Java.lang.IllegalStateException: Cannot call sendError() af ...