深搜(dfs)HDU1010,1016

HDU1016

题目http://acm.hdu.edu.cn/showproblem.php?pid=1016

#include<iostream>
#include<cmath>
using namespace
std;
int
n;
int
number[100],visited[100];
bool
isprime(int a)
{

    int
flag=0;
    for
(int i=2;i<=sqrt((double)a);i++)
    {

        if
(!(a%i))
        {

            return
false;
            flag=1;
        }
    }

    if
(!flag)
        return
true;
}

void
dfs(int pe)
{

    if
(pe==n&&isprime(number[0]+number[pe-1]))
    {

        for
(int i=0;i<n-1;i++)
            cout<<number[i]<<" ";
        cout<<number[n-1]<<endl;
    }

    for
(int i=2;i<=n;i++)
    {

        if
(!visited[i]&&isprime(number[pe-1]+i))//dfs加回溯。没有烦人的剪枝,嘿嘿!
        {
            visited[i]=1;       
            number[pe]=i;
            dfs(pe+1);//比如这一次是最后一次过了,那么下一次dfs中pe就为n了,其实pe就是表示那个环中的第几个环,从0开始哦
            visited[i]=0;//做了1016后,我算是比较清晰地认识了dfs了,就是每次都一搜到底,然后不行,就重新回溯,再搜到底,不行,再回溯。由深到浅啊。       
        }                  }
}

int
main(void)
{

    int
count=1;
    number[0]=1;
    while
(cin>>n)
    {

        cout<<"Case "<<count++<<':'<<endl;
        dfs(1);
        cout<<endl;   
    }

    return
0;
}

嘿嘿,终于知道什么叫DFS了,它与BFS的区别可能就是,DFS是一搜见底,不行了,回溯为上层,再一搜见底,,直到回溯到原始吧。这就是栈吧!1016,居然一次就AC了,幸福。。没有1010那么纠结,回想下1010.

HDU1010

题目http://acm.hdu.edu.cn/showproblem.php?pid=1010

代码:

#include<iostream>
#include<cmath>
using namespace
std;

int
si,sj,di,dj,flag,t,n,m;
char
  maze[7][7];
int
forward[4][2]={-1,0,0,1,1,0,0,-1};
bool
mark[7][7];

void
dfs(int x,int y,int s)
{

    int
nx,ny;
    if
(flag==1)
    return
;    
//    cout<<t<<endl;
    if((abs(di-x)+abs(dj-y))%2!=abs(t-s)%2)//剪枝,很重要,没有它,程序就tle
        return ;
    if
(s==t)
    {

        if
(x==di&&y==dj) 
            flag=1;
        return
;       
    }

    if
(abs(di-x)+abs(dj-y)>t-s) 
        return
;
    for
(int i=0;i<4;i++)
    {

        nx=x+forward[i][0]; 
        ny=y+forward[i][1];
        if
(nx>=1 && nx<=n && ny>=1 && ny<=m && mark[nx][ny]==0 && maze[nx][ny]!='X'
        {

            mark[nx][ny]=1;       
            dfs(nx,ny,s+1);    
            mark[nx][ny]=0;      
        }
    }
}

int
main(void)
{
   
    int
wall,i,j;
    while
(cin>>n>>m>>t,n||m||t)
    {

        for
(i=1;i<=n;i++)
            for
(j=1;j<=m;j++)
                mark[i][j]=0;
        wall=0;flag=0;
        for
( i=1;i<=n;i++)
            for
( j=1;j<=m;j++)
            {

                cin>>maze[i][j];
                if
(maze[i][j]=='S')
                {

                    si=i;
                    sj=j;
                    mark[i][j]=1;
                }

                else if
(maze[i][j]=='D')
                {

                    di=i;
                    dj=j;
                }
   
                else if
(maze[i][j]=='X'
                {

                    wall++;
                    mark[i][j]=1;
                }
            }

        if
(n*m-wall-1<t)    
        {

            cout<<"NO"<<endl;
            continue
;
        }
     
        dfs(si,sj,0);      
        flag? cout<<"YES"<<endl:cout<<"NO"<<endl;
    }

    return
0;
}
//哎,忘了注意全局变量t,,我把全局变量在主函数中重新定义,结果造成t在子函数中总为0,结果悲剧了。。。。哎,,有时候ac不了,纯粹是细节,细节。。纠结了一个晚上的DFS+剪枝题。第一次没有剪枝,悲剧了,tle.可见DFS的弱点还是挺明显的,盲目的搜索不是很OK啊,以后做题应多思考,能减少计算机运算一次,就减少一次。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值