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;
}
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;
}
相关文章推荐
- pku 2362_Square 深搜+回溯
- pku acm 2362 square 解题报告
- pku2362 Square(又是TLE.....................)
- pku 2362 Square
- poj 2362 Square
- POJ 2362 Square
- POJ_2362_Square
- poj 2362 Square
- poj 2362 Square
- POJ 2362:Square(DFS)
- poj2362——Square(深搜dfs)
- POJ 2362 HDOJ 1518 Square DFS剪枝
- poj 2362 Square
- PKU 2362
- POJ 2362 Square
- POJ 2362 square(DFS范例题)
- poj 2362 Square
- POJ 2362 Square
- poj 2362:Square
- POJ_2362_Square