DFS应用

来源:互联网 发布:淘宝折800拼团 编辑:程序博客网 时间:2024/05/19 08:03

深度优先搜索

跟着林总走。

POJ 1979 Red and Black

简单递归,求能走过的可达总点数。
‘.’ - a black tile 可达
‘#’ - a red tile 不可回溯
‘@’ - a man on a black tile(appears exactly once in a data set) 起始点

#include <stdio.h>char wall[21][21];int sum=0,m,n,i,j;char w;void dfs(int a,int b)//挨个函数调用{    if(wall[a][b]=='#')//碰到墙        return;    if(a>m-1||a<0&&b>n-1||b<0)//超出边界        return;    sum++;    wall[a][b]='#';//走过的标记成墙    dfs(a+1,b);//上下左右各扩展一步    dfs(a,b+1);    dfs(a-1,b);    dfs(a,b-1);}int main(){    int a,b;    while(scanf("%d%d",&m,&n),m||n)    {        for(i=0;i<m;i++)        {            getchar();//可以利用getchar()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面                      //也可以吃换行符吧                      //百度完才理解林总嫌弃的眼神            for(j=0;j<n;j++)            {                scanf("%c",&w);                wall[i][j]=w;                if(w=='@')//遇到起始点,开始                {                    a=i;                    b=j;                }            }        }        dfs(a,b);        printf("%d",sum);    }    return 0;}

HDU 2553 N皇后问题

#include <iostream>#include <stdio.h>#include <math.h>#include <stdlib.h>using namespace std;int sum=0;//计数用int a[22],N;//计算N = 1~21皇后的不同放置数量,然后打表int ans[22];//ans for answerint canplace(int row)//row表示一行row列{    for(int i=0;i<row;i++)    {        if((abs(row-i)==abs(a[row]-a[i]))||a[row]==a[i])//对角线和列            return 0;        else            return 1;    }}void queen(int row)//row表示第row行{    for(int i=0;i<N;i++)//从头开始    {        a[row]=i;//试探当前行的每一个位置        if(canplace(row))//如果这一行的row位置可以放          queen(row+1);//那就下一行        if(row==N)        sum++;//到头了,count住一种方法    }}void main(){    int i,m;    for(i=0;i<22;i++)    {        //sum=0;        N=i;        queen(0);        ans[i]=sum;    }    while(scanf("%d",&N)&&N)        printf("%d",ans[N]);    //getchar();}
0 0
原创粉丝点击