您的位置:首页 > 其它

pku 2362 Square

2010-08-18 23:30 169 查看
题目连接

http://acm.pku.edu.cn/JudgeOnline/problem?id=2362





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

int N,M;
int edgeLen,sum;
bool bfind;

int sticks[21],visited[21];

//按递减的顺序排列
int descend(const void * e1,const void *e2){
return (*(int *)e1) - (*(int *)e2) < 0 ? 1 : -1;
}

void dfs(int stick_num,int cur_len,int edge){
//cout<<stick_num<<" "<<cur_len<<" "<<edge<<endl;
visited[stick_num] = true;
if(edge == 4){
bfind = true;
return ;
}
else if(cur_len == edgeLen){
//一条边已经拼好,搜索拼下一条边
edge++;
//!!!!!!!!!!!!!
//edge++这样写就是正确的,要是在dfs调用里写成++edge就错!!!
//!!!!!!!!!!!!!!!
for(int i = 0;i < M;i++)
if(visited[i] == false)
dfs(i,sticks[i],edge);
}
else{
//把当前的边补充完整,按边长递减的顺序dfs
for(int i = stick_num + 1;i < M;i++)
if(visited[i] == false && cur_len + sticks[i] <= edgeLen)
dfs(i,cur_len + sticks[i],edge);
}
//当不能拼成一个正方形时,回溯,退一条边
if(bfind == false)
{
visited[stick_num] = false;
edge--;
}
}

int main(){
cin>>N;
while(N--){
cin>>M;
int max = 0;
sum = 0;
for(int i = 0;i < M;i++){
cin>>sticks[i];
sum += sticks[i];
visited[i] = false;
if(max < sticks[i])
max = sticks[i];
}
edgeLen = sum / 4;
//是4的倍数
if(sum % 4 == 0 && max <= edgeLen){
bfind = false;
qsort(sticks,M,sizeof(int),descend);
dfs(0,sticks[0],1);
if(bfind == false)
cout<<"no"<<endl;
else
cout<<"yes"<<endl;
}
else
cout<<"no"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: