数据结构之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;
}