数据结构之dfs

dfs:

注意的小问题,如果是多路径的话,一次memset(vis,o,sizeof(vis))如果跟步骤有关要申请一个全局变量

理解栈与递归

 hdu  1518
数据拼正方形;
思路:就是排序,首先可以剪枝,就是sum%4!=0的,有个小的处理就是先求出sum/4;
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
    return a>b?true:false;
}
int s[21];
bool used[21];
int N,target,sum;

int dfs(int curs,int curl,int pos)
{
    if(curs==3)//这里的小处理就比较巧了,因为sum是整除4的
       return 1;
    for(int i=pos;i<N;i++)
    {
        if(used[i]==true)
            continue;
        if(curl+s[i]==target)
        {
            used[i]=true;
            if(dfs(curs+1,0,0)==true)
                return true;
            used[i]=false;//递归的需要,这一点特别需要注意的地方
        }
        else if(curl+s[i]<target)
        {
            used[i]=true;
            if(dfs(curs,curl+s[i],i)==true)//这里是继续往下找的意思
                return true;
            used[i]=false;
        }
    }
    return false;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>N;
        sum=0;
        for(int i=0;i<N;i++)
        {
            cin>>s[i];
            sum += s[i];
        }
        if(sum % 4!=0 || N<4)
            cout<<"no"<<endl;
        else
        {
            target=sum/4;
            for(int i=0;i<21;i++)
                used[i]=false;
            sort(s,s+N,cmp);
            if(target<s[0])
                cout<<"no"<<endl;
            else if(dfs(0,0,0)==true)
                cout<<"yes"<<endl;
            else
                cout<<"no"<<endl;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ACWQYYY/p/4374106.html