pku 2362 Square

来源:互联网 发布:皇朝娱乐关注软件 编辑:程序博客网 时间:2024/06/01 08:15

 

题目连接

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;
}

原创粉丝点击