zoukankan      html  css  js  c++  java
  • HDU1016HDU1010(DFS)

    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啊,以后做题应多思考,能减少计算机运算一次,就减少一次。

  • 相关阅读:
    mac重启nginx时报nginx.pid不存在的解决办法
    js 正则表达式
    js 闭包
    js yarn
    js npm
    vue3 vite
    node 错误处理
    node fs
    linux包管理工具使用和区别(转)
    MySQL数据库学习----理论基础
  • 原文地址:https://www.cnblogs.com/cchun/p/2520063.html
Copyright © 2011-2022 走看看