算法设计与分析的答案 第4章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析(第二版)
主编:吕国英
习题答案
第四章
1.
#include
int main(void)
{
int buf[100];
int n;
int i,j,k;
scanf("%d",&n);
for(i=0;i
for(i=0;i
for(j=0;j
buf[j]+=2;
}
}
for(j=0;j
if(buf[j]>=10)
{
buf[j+1]+=buf[j]/10;
buf[j]=buf[j]%10;
}
}
}
for(i=n-1;i>=0;i--)
printf("%d",buf[i]);
printf("\n");
return 0;
}
2.
#include
int main(void)
{
int n=2;
int i;
for(i=1;i<=9;i++)
{
n=(n+2)*2;
}
printf("%d\n",n);
return 0;
}
3.
#include
int main(void)
{
int a=54;
int n;
int m;
printf("计算机先拿3张牌\n");
a=a-3;
while(a>=0)
{
printf("还剩%d张牌\n",a);
printf("你拿几张?请输入:");
scanf("%d",&n);
if(n>4||n<1||n>a)
{
printf("错误!重新拿牌\n");
continue;
}
a=a-n;
printf("还剩%d张牌\n",a);
if(a==0)
break;
m=5-n;
printf("计算机拿%d\n",m);
a=a-m;
}
return 0;
}
4.
#include
int d;
int a1,a2;
int fun(int n);
int main(void)
{
int n;
printf("n=?,d=?,a1=?,a2=?");
scanf("%d%d%d%d\n",&n,&d,&a1,&a2);
printf("%d\n",fun(n));
return 0;
}
int fun(int n)
{
if(n==1)
return a1;
if(n==2)
return a2;
return fun(n-2)-(fun(n-1)-d)*2;
}
5.
#include
char chess[8][8];
int is_safe(int row,int col);
int queen(int row,int col,int n);
int main(void)
{
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
chess[i][j]='X';
queen(0,0,0);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%c ",chess[i][j]);
printf("\n");
}
return 0;
}
int is_safe(int row,int col)
{
int i,j;
for(i=0;i<8;i++)
{
if(chess[row][i]=='Q')
return 0;
if(chess[i][col]=='Q')
return 0;
}
i=row;
j=col;
while(i!=-1&&j!=-1)
{
if(chess[i--][j--]=='Q')
return 0;
}
i=row;
j=col;
while(i!=-1&&j!=8)
{
if(chess[i--][j++]=='Q')
return 0;
}
i=row;
j=col;
while(i!=8&&j!=-1)
{
if(chess[i++][j--]=='Q')
return 0;
}
i=row;
j=col;
while(i!=8&&j!=8)
{
if(chess[i++][j++]=='Q')
return 0;
}
return 1;
}
int queen(int row,int col,int n)
{
int i,j;
int result=0;
if(n==8)
return 1;
else
if(is_safe(row,col))
{
chess[row][col]='Q';
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
result+=queen(i,j,n+1);
if(result>0)
break;
}
if(result>0) return 1;
else
{
chess[row
][col]='X';
return 0;
}
}
else
return 0;
}
6.
#include
int main(void)
{
int i,j,k;
for(i=1;i<=33;i++)
for(j=1;j<=50;j++)
{
k=100-i-j;
if(k%2==0)
{
if(3*i+2*j+k/2==100)
printf("大马%d\n中马%d\n小马%d\n\n\n",i,j,k);
}
}
return 0;
}
7.
#include
int main(void)
{
int i;
for(i=1;i<=10000;i++)
{
if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0)
printf("%d\n",i);
}
return 0;
}
8.
#include
int main(void)
{
int i;
int sum;
int a1,a2,a3,a4;
for(i=1000;i<=9999;i++)
{
a1=i%10;
a2=i/10%10;
if(a1!=a2)
{
a3=i/100%10;
if(a1!=a3&&a2!=a3)
{
a4=i/1000;
if(a1!=a4&&a2!=a4&&a3!=a4)
{
sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);
if(i%sum==0)
printf("%d\n",i);
}
}
}
}
return 0;
}
9.
#include
#define N 10
void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2);
int main(void)
{
int a[N]={2,3,4,5,34,7,9,6,43,21};
int min1,min2;
int max1,max2;
max_min(a,0,N-1,&min1,&min2,&max1,&max2);
printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,max1,max2);
return 0;
}
void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2)
{
int lmin1,lmin2,lmax1,lmax2;
int rmin1,rmin2,rmax1,rmax2;
int mid;
if(m==n)
{
*min1=*min2=*max1=*max2=a[m];
}
else
if(m==n-1)
{
if(a[m]{
*min1=a[m];
*min2=a[n];
*max1=a[n];
*max2=a[m];
}
else
{
*min1=a[n];
*min2=a[m];
*max1=a[m];
*max2=a[n];
}
}
else
{
mid=(m+n)/2;
max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);
max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);
if(lmin1
if(lmin2
*min1=lmin1;
*min2=lmin2;
}
else
{
*min1=lmin1;
*min2=rmin1;
}
}
else
if(rmin2
*min1=rmin1;
*min2=rmin2;
}
else
{
*min1=rmin1;
*min2=lmin1;
}
if(lmax1>rmax1)
{
if(lmax2>rmax1)
{
*max1=lmax1;
*max2=lmax2;
}
else
{
*max1=lmax1;
*max2=rmax1;
}
}
else
if(rmax2>lmax1)
{
*max1=rmax1;
*max2=rmax2;
}
else
{
*max1=rmax1;
*max2=lmax1;
}
}
}
10.
#include
int add(int *a,int flag,int right);
int main(void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=add(a,0,9);
printf("%d\n",sum);
return 0;
}
int add(int *a,int flag,int right)
{
int mid;
if(flag==right)
{
return a[flag];
}
else
if(flag==right-1)
{
return a[flag]+a[right];
}
else
{
mid=(flag+right)/2;
return add(a,flag,mid)+add(a,mid+1,right);
}
}
11.
#include
int main(void)
{
int a[5][3]={
{-50,17,-42},
{-47,-19,-3},
{36,-34,-43},
{-30,-43,34},
{-23,-8,-45}
};
int i,j;
int max,n;
int sum=0;
for(i=0;i<5;i++)
{
max=a[i][0];
n=0;
for(j=1;j<3;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
n=j;
}
}
sum+=max;
printf("a[%d][%d]=%d\n",i,n,max);
}
printf("%d\n",sum);
return 0;
}
12.
/*
* File: newmain.c
* Author: nirnava
*
* Created on 2010年4月22日, 下午5:21
*/
#include
#include
#define N 4
void matrix_mul(int *mul1,int *mul2,int *mul3,int length);
void matrix_add_sub(int * A,int * B,int * C,int m,char ch);
void update_half_value(int * A,int * B,int m);
void get_half_value(int * A,int * B,int m);
int main(void)
{
int i,j;
int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};
int mul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};
int mul3[N*N];
matrix_mul(mul1,mul2,mul3,N);
for(i=0;i
printf("%5d",mul3[i]);
if((i+1)%N==0)
printf("\n");
}
return 0;
}
void matrix_add_sub(int * A,int * B,int * C,int m,char ch)
{
int i;
for(i=0;i
if(ch=='+')
C[i]=A[i]+B[i];
else
C[i]=A[i]-B[i];
}
}
void update_half_value(int * A,int * B,int m)
{
int i,j;
for(i=0;i
for(j=0;j
B[i*m+j]=A[i*m/2+j];
}
}
}
void get_half_value(int * A,int * B,int m)
{
int i,j;
for(i=0;i
for(j=0;j
A[i*m/2+j]=B[i*m+j];
}
}
}
void matrix_mul(int *A,int *B,int *C,int m)
{
if(m==2)
{
int D,E,F,G,H,I,J;
D=A[0]*(B[1]-B[3]);
E=A[3]*(B[2]-B[0]);
F=(A[2]+A[3])*B[0];
G=(A[0]+A[1])*B[3];
H=(A[2]-A[0])*(B[0]+B[1]);
I=(A[1]-A[3])*(B[2]+B[3]);
J=(A[0]+A[3])*(B[0]+B[3]);
C[0]=E+I+J-G;
C[1]=D+G;
C[2]=E+F;
C[3]=D+H+J-F;
return ;
}
else
{
int A1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];
int B1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];
int C1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];
int D[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4];
int temp1[m*m/4],temp2[m*m/4];
get_half_value(A1,&A[0],m);
get_half_value(A2,&A[m/2],m);
get_half_value(A3,&A[m*m/2],m);
get_half_value(A4,&A[m*m/2+m/2],m);
get_half_value(B1,&B[0],m);
get_half_value(B2,&B[m/2],m);
get_half_value(B3,&B[m*m/2],m);
get_half_value(B4,&B[m*m/2+m/2],m);
matrix_add_sub(B2,B4,temp1,m/2,'-');
matrix_mul(A1,temp1,D,m/2);
matrix_add_sub(B3,B1,temp1,m/2,'-');
matrix_mul(A4,temp1,E,m/2);
matrix_add_sub(A3,A4,temp1,m/2,'+');
matrix_mul(temp1,B1,F,m/2);
matrix_add_sub(A1,A2,temp1,m/2,'+');
matrix_mul(temp1,
B4,G,m/2);
matrix_add_sub(A3,A1,temp1,m/2,'-');
matrix_add_sub(B1,B2,temp2,m/2,'+');
matrix_mul(temp1,temp2,H,m/2);
matrix_add_sub(A2,A4,temp1,m/2,'-');
matrix_add_sub(B3,B4,temp2,m/2,'+');
matrix_mul(temp1,temp2,I,m/2);
matrix_add_sub(A1,A4,temp1,m/2,'+');
matrix_add_sub(B1,B4,temp2,m/2,'+');
matrix_mul(temp1,temp2,J,m/2);
matrix_add_sub(E,I,temp1,m/2,'+');
matrix_add_sub(J,G,temp2,m/2,'-');
matrix_add_sub(temp1,temp2,C1,m/2,'+');
matrix_add_sub(D,G,C2,m/2,'+');
matrix_add_sub(E,F,C3,m/2,'+');
matrix_add_sub(D,H,temp1,m/2,'+');
matrix_add_sub(J,F,temp2,m/2,'-');
matrix_add_sub(temp1,temp2,C4,m/2,'+');
update_half_value(C1,&C[0],m);
update_half_value(C2,&C[m/2],m);
update_half_value(C3,&C[m*m/2],m);
update_half_value(C4,&C[m*m/2+m/2],m);
return ;
}
}
13.
#include
int main(void)
{
int a[6][7]={
{16,4,3,12,6,0,3},
{4,-5,6,7,0,0,2},
{6,0,-1,-2,3,6,8},
{5,3,4,0,0,-2,7},
{-1,7,4,0,7,-5,6},
{0,-1,3,4,12,4,2}
};
int b[6][7],c[6][7];
int i,j,k;
int max;
int flag;
int temp;
for(i=0;i<6;i++)
for(j=0;j<7;j++)
{
b[i][j]=a[i][j];
c[i][j]=-1;
}
for(i=1;i<5;i++)
{
for(j=0;j<7;j++)
{
max=0;
for(k=j-2;k<=j+2;k++)
{
if(k<0) continue;
else
if(k>6)
break;
else
{
if(b[i][j]+b[i-1][k]>max)
{
max=b[i][j]+b[i-1][k];
flag=k;
}
}
}
b[i][j]=max;
c[i][j]=flag;
}
}
for(j=1;j<=5;j++)
{
max=0;
for(k=j-2;k<=j+2;k++)
{
if(k<0)
continue;
else
if(k>6)
break;
else
{
if(b[i][j]+b[i-1][k]>max)
{
max=b[i][j]+b[i-1][k];
flag=k;
}
}
}
b[i][j]=max;
c[i][j]=flag;
}
max=0;
for(j=1;j<=5;j++)
{
if(b[i][j]>max)
{
max=b[i][j];
flag=j;
}
}
printf("%d\n",max);
temp=c[i][flag];
printf("%5d",a[i][temp]);
for(j=i;j>0;j--)
{
temp=c[j][temp];
printf("%5d",a[j-1][temp]);
}
printf("\n");
return 0;
}
14.
#include
int main(void)
{
int A[6]={0,3,7,9,12,13};
int B[6]={0,5,10,11,11,11};
int C[6]={0,4,6,11,12,12};
int AB[6][6];
int temp[6];
int abc[6];
int max;
int flag;
int i,j,k;
for(i=0;i<=5;i++)
{
max=0;
for(j=0;j<=i;j++)
{
AB[i][j]=A[i-j]+B[j];
if(AB[i][j]>max)
max=AB[i][j];
}
temp[i]=max;
}
max=0;
for(i=0;i<=5;i++)
{
abc[i]=temp[i]+C[5-i];
if(abc[i]>max)
{
max=abc[i];
flag=i;
}
}
printf("max=%d\n",max);
printf("c=%d\n",5-flag);
max=max-C[5-flag];
for(i=0;i<=flag;i++)
{
if(AB[flag][i]==max)
{
printf("b=%d\n",i);
printf("a=%d\n",flag-i);
break;
}
}
return 0;
}
16.
#include
#define N 100
int search(int *a,int left,int right);
int sum_buf(int *a,int left,int right);
int main(void)
{
int a[N];
int i;
int s;
for(i=0;i
a[24]=2;
s=search(a,0,N-1);
printf("%d\n",s);
return 0;
}
int sum_buf(int *a,int left,int right)
{
int i;
int sum=0;
for(i=left;i<=right;i++)
sum+=a[i];
return sum;
}
int search(int *a,int left,int right)
{
int mid=(left+right)/2;
if(left==right-1)
{
if(a[left]return right;
else
return left;
}
if(mid*2!=(right+left-1))
{
if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right))
{
return search(a,left,mid-1);
}
else
if(sum_buf(a,left,mid-1)
return search(a,mid+1,right);
}
else
return mid;
}
else
{
if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right))
return search(a,left,mid);
else
return search(a,mid+1,right);
}
}
17.
#include
int job[6][2]={
{3,8},
{12,10},
{5,9},
{2,6},
{9.3},
{11,1}
};
int x[6],bestx[6],f1=0,bestf,f2[7]={0};
void try(int i);
void swap(int a,int b);
int main(void)
{
int i,j;
bestf=32767;
for(i=0;i<6;i++)
x[i]=i;
try(0);
for(i=0;i<6;i++)
printf("%d ",bestx[i]);
printf("\nbestf=%d\n",bestf);
return 0;
}
void try(int i)
{
int j;
if(i==6)
{
for(j=0;j<6;j++)
bestx[j]=x[j];
bestf=f2[i];
}
else
{
for(j=i;j<6;j++)
{
f1=f1+job[x[j]][0];
if(f2[i]>f1)
f2[i+1]=f2[i]+job[x[j]][1];
else
f2[i+1]=f1+job[x[j]][1];
if(f2[i+1]
swap(i,j);
try(i+1);
swap(i,j);
}
f1=f1-job[x[j]][0];
}
}
}
void swap(int i,int j)
{
int temp;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
18.
#include
#define N 5 //N个数字
#define M 2 //M个加号
char buf[N];
int a[N];
char b[M+1][N];
int c[M+1];
int try(int t);
void swap(int t1,int t2);
int add();
void output();
int min=99999;
int main()
{
int i;
for(i=0;i
scanf("%c",&buf[i]);
}
a[0]=0;
for(i=1;i<=M;i++)
{
a[i]=1;
}
for(;i
a[i]=0;
}
try(1);
output();
printf("%d\n",min);
return 0;
}
int try(int t)
{
int j;
int i;
int sum;
if(t>=N)
{
sum=add();
if(sum
min=sum;
for(i=0;i
c[i]=atoi(b[i]);
}
}
/*
for(i=0;i
printf("%d",a[i]);
}
printf("\n");
*/
}
else
{
for(j=t;j
//if(a[t]!=a[j])
{
swap(t,j);
try(t+1);
swap(t,j);
}
//else
//try(t+1);
}
}
}
void swap(int t1,int t2)
{
int t;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
}
int add()
{
int sum=0;
int i=0;
int j;
int k=0;
int h=0;
for(i=0;i
i=0;
j=0;
h=0;
k=0;
for(j=0;j
if(a[j]==1)
{
h=0;
i++;
b[i][h]=buf[j];
//printf("%d ",atoi(b[i]));
//printf("%d %d %c \n",i,h,b[i][h]);
h++;
}
else
{
b[i][h]=buf[j];
//printf("%d %d %c \n",i,h,b[i][h]);
//printf("%d ",atoi(b[i]));
h++;
}
}
/*
for(i=0;i
for(j=0;j
printf("\n");
}
*/
for(i=0;i
sum+=atoi(b[i]);
}
return sum;
}
void output()
{
int i;
for(i=0;i
printf("%d",atoi(b[i]));
if(i!=M)
printf("+");
}
printf("=");
}
19.
#include
int main(void)
{
int buf[100];
int m,n;
int i,j;
buf[0]=1;
buf[1]=1;
scanf("%d%d",&n,&m);
for(i=1;i
buf[i+1]=buf[i];
for(j=i;j>0;j--)
{
buf[j]=buf[j]+buf[j-1];
}
}
printf("%d\n",buf[m]);
return 0;
}
20.
#include
int max_sum4(int *a,int n);
int max_sub_sum(int *a,int left,int right);
int main(void)
{
int a[6]={-2,11,-4,13,-5,-2};
printf("%d\n",max_sum4(a,5));
return 0;
}
int max_sum4(int *a,int n)
{
return max_sub_sum(a,0,n);
}
int max_sub_sum(int *a,int left,int right)
{
int center,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights,leftl,rightl;
int buf[4];
if(left==right)
return a[left];
else
{
center=(left+right)/2;
left_sum=max_sub_sum(a,left,center);
right_sum=max_sub_sum(a,center+1,right);
s1=0;
lefts=0;
for(i=center;i>=left;i--)
{
lefts+=a[i];
if(lefts>s1)
s1=lefts;
}
s2=0;
rights=0;
for(i=center+1;i<=right;i++)
{
rights+=a[i];
if(rights>s2)
s2=rights;
}
s3=0;
leftl=0;
for(i=left;i<=center;i++)
{
leftl+=a[i];
if(leftl>s3)
s3=leftl;
}
s4=0;
rightl=0;
for(i=right;i>=center+1;i--)
{
rightl+=a[i];
if(rightl>s4)
s4=rightl;
}
buf[0]=s1+s2;
buf[1]=s4+s3;
buf[2]=left_sum;
buf[3]=right_sum;
max=0;
for(i=0;i<=3;i++)
{
if(buf[i]>max)
max=buf[i];
}
return max;
}
}