zoj 1909 Square 不能编译求指导!!

来源:互联网 发布:2016十大网络mc排行榜 编辑:程序博客网 时间:2024/04/29 22:37

zoj 1909Square不能编译求指导!!

     求不要再跳闸了!哎,本来这道题目是暑假训练的时候布置的,结果现在才稍微弄清楚了点,结果还因为函数问题不能编译!求指导!
     题意:给出n段被截开的木条,这些木条只能拼凑不能再截断,问这些木条能不能拼出一个正方形。明显递归+搜索。

     细节+代码:

 

    

#include<stdio.h>#include<algorithm> //百度说sort()要用的头文件。#include<string.h>int avg,visit[10000],sum,a[10000],n;int dfs(int part, int sum,int mark){ //分别是正在拼的这条边还需要的长度、int i,t;                         //总体还需要的长度和现在搜索到的木条的编号。if(sum==avg) //第四条边不用处理。return 1;for(i = mark;i<=n-1;i++){if(a[i]==a[i-1]&&visit[i-1]==0) //前一条和它一样长的木条如果没用到,这条也用不到。continue;if(a[i]<=part&&visit[i]==0){visit[i] = 1;if(a[i]==part){t = dfs(avg,sum-avg,0); //新的一条边从编号0开始。if(t==1)return 1;}if(a[i]<part){t = dfs(part-a[i],sum-a[i],mark+1);if(t==1)return 1;}visit[i] = 0; //如果经过以上都没有返回值,这条木条不可用,这没什么,if(part==avg) //最终总会退回到最初的那条边上不可以用的木条,return 0; //如果是第一条,意味着最长的木条不可用,其他边也一样用不了这一条,那么一定不能构成。}}}bool compare(int a,int b){ //百度来的,为了改变sort()函数为降序。return a>b;}int main(){int i,j,T;scanf("%d",&T);for(i = 1;i<=T;i++){memset(visit,0,sizeof(visit));scanf("%d",&n);sum = 0;max = 0;for(j = 0;j<=n-1;j++{scanf("%d",&a[j]);sum = sum+a[j];if(a[j]>max) max = a[j];}if(sum%4!=0){ //能整除。printf("no\n");return 0;}avg = sum/4;if(max>avg){ //最长木条不可以大于边长。printf("no\n");return 0;}sort(a,a+n,compare); //百度来的,给木条降序排序。num = dfs(avg,sum,mark);if(num==0)printf("no\n");elseprintf("yes\n");}return 0;}


 

 

原创粉丝点击