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

原文地址:https://www.cnblogs.com/cchun/p/2520063.html