SlideShare a Scribd company logo
Bài 39
+ Câu a:
#include <iostream.h>
#include <stdlib.h>
const max=30;
//Nhập mảng ngẫu nhiên
void input(int a[], int &n)
{ cout<<"nNhap so phan tu:"; cin>>n; randomize();
for(int i=0;i<n;i++) a[i]=random(20);
}
//Xuất mảng
void output(int a[], int n)
{
for(int i=0;i<n;i++) cout<<a[i]<<",";
}
//dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap
void adjust(int a[], int i, int n)
{ int x=a[i];
int j=2*i,done=0;
while(j<=n&&!done)
{
if(j<n&&a[j+1]>a[j]) j=j+1;
if(a[j]>x) {a[i]=a[j];i=j;j=2*i;}
else done=1;
}
a[i]=x;
}
void heapsort(int a[], int n)
{
for(int i=n/2;i>=1;i--) adjust(a,i,n);
for(int j=n;j>=2;j--)
{ int x=a[1]; a[1]=a[j]; a[j]=x;
adjust(a,1,j-1);
}
}
void main()
{ int a[max],n;
input(a,n);
cout<<"nDay truoc khi sx:"; output(a,n);
heapsort(a,n);
cout<<"nDay sau khi sx:"; output(a,n);
}
+ Câu b:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
const max=50;
void input(int a[], int &n)
{ cout<<endl<<"Nhap so phan tu:"; cin>>n;
randomize();
for(int i=1;i<=n;i++) a[i]=random(max);
}
void output(int a[], int n)
{
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}
int sub_max(int a[], int n, int j)
{ int k=0;
if(j<=n)
{ k=j;
if (j+1<=n&&a[j+1]>a[k]) k=j+1;
if (j+2<=n&&a[j+2]>a[k]) k=j+2;
}
return k;
}
void Adjust(int a[], int i, int n)
{ int x=a[i];
while(1)
{ int k=sub_max(a,n,3*i-1);
if(k==0||a[k]<x) break;
a[i]=a[k]; i=k;
}
a[i]=x;
}
void HeapSort(int a[], int n)
{ for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n);
for(int j=n;j>=2;j--)
{ int x=a[1]; a[1]=a[j]; a[j]=x;
Adjust(a,1,j-1);
}
}
void main()
{ int a[max],n;
input(a,n);
cout<<endl<<"Day truoc khi sap:"<<endl;
output(a, n);
HeapSort(a,n);
cout<<endl<<"Day sau khi sap:"<<endl;
output(a, n);
}
Bài 2: Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp
dãy số trên file.
//tron tu nhien ba bang hai giai doan tren file
#include <stdio.h>
#include <stdlib.h>
//tao file chua n so nguyen ngau nhien tu 0 den 19
void WriteFile(char *filename, int n)
{
FILE *f; int i;
f=fopen(filename,"w");
randomize();
for (i=1;i<=n;i++)
fprintf(f,"%d ",random(20));
fclose(f);
}
//doc file chua cac so nguyen hien ra man hinh
void ReadFile(char *filename)
{
FILE *f; int x;
f=fopen(filename,"r");
printf("n");
while (fscanf(f,"%d",&x)!=EOF)
printf("%d ",x);
fclose(f);
}
//doc mot so tu file f1 ghi vao file f2,
//neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc
//thi doan con trong file f1 da het, gan endsub=1
void CopyRecord(FILE *f1,FILE *f2, int &endsub)
{
int n,m; long p1,p2;
endsub=0;
if (fscanf(f1,"%d",&n)!=EOF)
{
fprintf(f2,"%d ",n);
fgetpos(f1,&p1);
if (fscanf(f1,"%d",&m)==EOF) endsub=1;
else
{
if (m<n) endsub=1;
fsetpos(f1,&p1);
}
}
else endsub=1;
}
//chep mot doan con tu f1 vao f2
void CopySub(FILE *f1,FILE *f2)
{
int endsub=0;
while (!endsub)
CopyRecord(f1,f2,endsub);
}
//tach filename thanh filename1 va filename2
void Split(char *filename, char *filename1, char *filename2)
{
int flag,n,n1; FILE *f,*f1,*f2;
f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w");
flag=1;
while (!feof(f))
{
if (flag) CopySub(f,f1);
else CopySub(f,f2);
flag=1-flag;
}
fclose(f);fclose(f1);fclose(f2);
}
//tra ve so nguyen ma con tro f dang tro toi
//neu con tro o cuoi file thi gan endsub=1
int CurRecord(FILE *f, int &endsub)
{
int n; long p;
endsub=0;
fgetpos(f,&p);
if (fscanf(f,"%d",&n)==EOF) endsub=1;
else fsetpos(f,&p);
return n;
}
//tron filename1 va filename2, ghi vao filename
int Merge(char *filename1, char *filename2, char *filename)
{
FILE *f, *f1, *f2;
int numsub,endsub1,endsub2,n1,n2;
f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w");
numsub=0;
while (!feof(f1)||!feof(f2))
{
endsub1=endsub2=0;
do
{
n1=CurRecord(f1,endsub1);
n2=CurRecord(f2,endsub2);
if (!endsub1&&!endsub2)
{
if (n1<n2) CopyRecord(f1,f,endsub1);
else CopyRecord(f2,f,endsub2);
}
}while(!endsub1 && !endsub2);
if (!endsub1) CopySub(f1,f);
else if (!endsub2) CopySub(f2,f);
numsub++;
}
while (!feof(f1))
{
CopySub(f1,f);
numsub++;
}
while (!feof(f2))
{
CopySub(f2,f);
numsub++;
}
fclose(f);fclose(f1);fclose(f2);
return numsub;
}
void MergeSort(char *filename)
{
char *filename1="d:temp1.txt", *filename2="d:temp2.txt";
int numsub;
do
{
Split(filename,filename1,filename2);
numsub=Merge(filename1,filename2,filename);
}while(numsub>1);
}
void main()
{
char *filename="d:test.txt";
char *filename1="d:temp1.txt";
char *filename2="d:temp2.txt";
int n;
printf("nNhap so phan tu cua day so:");
scanf("%d",&n);
WriteFile(filename,n);
ReadFile(filename);
MergeSort(filename);
ReadFile(filename);
}
bai 6 trang 103
vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3)
se co hai nghiem la: x=(1,0,1) va x=(1,1,0)
#include <stdio.h>
#include <conio.h>
int x[100],a[100],n,b,count,s;
void init()
{
printf("n="); scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("a%d=",i+1); scanf("%d",&a[i]);
}
printf("b="); scanf("%d",&b);
count=0; s=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=0; j<=1; j++)
{
if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b
{
x[i]=j; //xac dinh x[i]
s=s+a[i]*x[i]; //cap nhat bien trang thai s
if (i==n-1)
{
if (s==b) result();
}
else Try(i+1);
s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 7 trang 103
vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3)
se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)
#include <stdio.h>
#include <conio.h>
int x[100],a[100],n,b,count,s;
void init()
{
printf("n="); scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("a%d=",i+1);
scanf("%d",&a[i]);
}
printf("b="); scanf("%d",&b);
count=0; s=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan
{
if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b
{
x[i]=j; //xac dinh x[i]
s=s+a[i]*x[i]; //cap nhat bien trang thai s
if (i==n-1)
{
if (s==b) result();
}
else Try(i+1);
s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 9 trang 104
vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so
5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1
#include <stdio.h>
#include <conio.h>
int x[100],N,count,s,k,n;
void init()
{
printf("N="); scanf("%d",&N);
count=0; s=0; k=1; n=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=k; j<=N; j++)//cac kha nang cua x[i]
{
if (s<N)
{
x[i]=j; //xac dinh x[i]
s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n
if (s==N) result();
else if (s<N) Try(i+1);
s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 10 trang 104: hinh vuong than bi
Y tuong: (moi ma phuong la mot hoan vi)
- tim tat ca cac hoan vi cua tap {1,...,n*n}
- Kiem tra hoan vi nao la ma phuong thi in hoan vi do
#include <stdio.h>
#include <conio.h>
int x[100], b[100],n,count;
int a[10][10];
void init()
{
printf("n=");
scanf("%d",&n);
for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung
count=0;
}
int test() //kiem tra hoan vi co la ma phuong
{
int i, j, k, s, s0, s1, s2;
//doi hoan vi thanh ma tran de de kiem tra t/c ma phuong
i=0; j=0;
for (k=0;k<n*n;k++)
{
a[i][j]=x[k]; j++;
if (j==n) {i++; j=0;}
}
//kiem tra tong moi dong phai bang nhau
s0=0;//gia tri dong 0
for (j=0;j<n;j++)
s0=s0+a[0][j];
for (i=1;i<n;i++)
{
s=0;//gia tri dong i
for (j=0;j<n;j++)
s=s+a[i][j];
//neu dong i khac dong 0 thi khong phai ma phuong
if (s!=s0) return 0;
}
//kiem tra cot
s0=0;//gia tri cot 0
for (i=0;i<n;i++)
s0=s0+a[i][0];
for (j=1;j<n;j++)
{
s=0;//gia tri cot j
for (i=0;i<n;i++)
s=s+a[i][j];
//neu cot j khac cot 0 thi khong phai ma phuong
if (s!=s0) return 0;
}
//kiem tra duong cheo
s1=0,s2=0;
for (i=0;i<n;i++)
{
s1=s1+a[i][i];
s2=s2+a[i][n-1-i];
}
if (s1!=s2) return 0;
return 1; //hoan vi la ma phuong
}
void result()
{
if (test())
{
count++;
printf("nMa phuong %d:n",count);
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("n");
}
}
}
void Try(int i)
{
for (int j=0; j<n*n; j++)
{
if (b[j])
{
x[i]=j+1; b[j]=0;//j su dung roi
if (i==n*n-1) result();
else Try(i+1);
b[j]=1; //tra lai trang thai cu, j chua su dung
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
Giải:
Bài 2:
Hướng dẫn:
a) Duyệt từ đầu đến cuối văn bản chương trình và sử dụng các phép biến đổi tương đương
sau:
+ Nếu gặp lệnh while thì giữ nguyên.
+ Nếu gặp lệnh do..while chuyển sang while như sau:
do
{
khoi_lenh; //gồm một hoặc nhiều
lệnh
}while(bieu_thuc_đieu_kien);
khoi_lenh;
while(bieu_thuc_đieu_kien)
{
khoi_lenh;
}
+ Nếu gặp lệnh for chuyển sang while như sau:
for(bieu_thuc_1;bieu_thuc_dieu_kien;
bieu_thuc_2)
{
khoi_lenh;
}
bieu_thuc_1;
while(bieu_thuc_dieu_kien)
{
khoi_lenh;
bieu_thuc_2;
}
+ Nếu gặp lệnh if chuyển sang while như sau:
if (bieu_thuc_dieu_kien)
{
khoi_lenh;
}
while(bieu_thuc_dieu_kien )
{
khoi_lenh; break;
}
+ Nếu gặp lệnh if..else chuyển sang while như sau:
if (bieu_thuc_dieu_kien)
khoi_lenh_1;
else
khoi_lenh_2;
int flag=1;
while(bieu_thuc_dieu_kien )
{ khoi_lenh_1; flag=0; break;
}
while(flag)
{ khoi_lenh_2; break;
}
+ Nếu gặp lệnh switch() chuyển sang lệnh if else, sau đó từ if else chuyển sang while:
switch(bieu_thuc)
{
case gia_tri_1: khoi_lenh_1; break;
case gia_tri_2: khoi_lenh_2; break;
[. . . ]
case gia_tri_n: khoi_lenh_n; break;
[default: khoi_lenh_n+1; ]
}
if (bieu_thuc==gia_tri_1) khoi_lenh_1;
else
if (bieu_thuc==gia_tri_2) khoi_lenh_2;
else
[…]
if (bieu_thuc==gia_tri_n) khoi_lenh_n;
[else khoi_lenh_n+1;]
Bài 3:
Hướng dẫn
Cách 1:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep
char *filename="d:data.in";
void DocFile()
{
FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
}
void KhoiTao()
{
FOPT = -32000; //gan gia tri toi uu ban dau
//gan phuong an hien tai ban dau: x1=x2=...=xn=0
//va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0
for(int i=1; i<=n; i++)
{
X[i]=0;
XOPT[i]=0;
}
}
void DayNhiPhanKe()//tim day nhi phan ke tiep
{
int i=n;
while(i>0 && X[i]==1) {X[i]=0;i--;}
if( i==0) stop=1;
else X[i]=1;
}
void CapNhatPATU()//cap nhat phuong an toi uu
{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai
//S la tong trong luong cac vat ung voi phuong an hien tai
//P la tong gia tri cac vat ung voi phuong an hien tai
int S=0, P=0;
for( int i=1; i<=n ; i++)//tinh S va P
{
S = S + A[i] * X[i];
P = P + C[i] * X[i];
}
//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui
//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat
if ( S<=B && FOPT < P)
{
FOPT = P; // Cap nhat gia tri toi uu moi
for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi
XOPT[i] = X[i];
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{
printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile(); KhoiTao();
while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an
{
CapNhatPATU();
DayNhiPhanKe();
}
GhiFile();
}
Cách 2:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
char *filename="d:data.in";
void DocFile()
{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
FOPT = -32000; //gan gia tri toi uu ban dau
}
void CapNhatPATU()//cap nhat phuong an toi uu
{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai
//S la tong trong luong cac vat ung voi phuong an hien tai
//P la tong gia tri cac vat ung voi phuong an hien tai
int S=0, P=0;
for( int i=1; i<=n ; i++)//tinh S va P
{
S = S + A[i] * X[i];
P = P + C[i] * X[i];
}
//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui
//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat
if ( S<=B && FOPT < P)
{ FOPT = P; // Cap nhat gia tri toi uu moi
for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi
XOPT[i] = X[i];
}
}
void Try(int i)//lan luot xet tat ca cac phuong an
{
for(int j=0;j<=1;j++)
{
X[i]=j;
if(i==n) CapNhatPATU();
else Try(i+1);
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{
printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile();
Try(1);
GhiFile();
}
* Cach 3:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
char *filename="d:data.in";
int S=0,P=0;
void DocFile()
{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
FOPT = -32000; //gan gia tri toi uu ban dau
}
void Try(int i)//lan luot xet tat ca cac phuong an
{
for(int j=0;j<=1;j++)
{
X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i];
if(i==n)
{
if ( S<=B && FOPT < P)
{ FOPT = P; //Cap nhat gia tri toi uu moi
for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi
XOPT[k] = X[k];
}
}
else
if(S<B) Try(i+1);
S=S-A[i]*X[i];P=P-C[i]*X[i];
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{ printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile();
Try(1);
GhiFile();
}
Bai 24:
HD:
#include <conio.h>
#include <string.h>
char *data1="d:data1.out";
char *data2="d:data2.out";
int num1=0,num2=0;
void Sdt(int flag)//flag=0 la dem, flag=1 la ghi
{
FILE *f1=fopen(data1,"w");
FILE *f2=fopen(data2,"w");
if(flag==1) {fprintf(f1,"%d",num1);fprintf(f2,"%d",num2);}
for(int n=1;n<=4;n++)
for(int x1=0;x1<=9;x1++)
for(int x2=0;x2<=9;x2++)
for(int x3=0;x3<=9;x3++)
{
if(flag==0) num1++;
else
fprintf(f1,"n091%d.%d%d%d.%d%d
%d",n,x1,x2,x3,x3,x2,x1);
if(x1+x2+x3==4)
{ if (flag==0) num2++;
else
fprintf(f2,"n091%d.%d%d%d.%d%d
%d",n,x1,x2,x3,x3,x2,x1);
}
}
fclose(f1);fclose(f2);
}
void main()
{ Sdt(0);//dem cac so dien thoai
Sdt(1);//ghi cac so dien thoai vao file
}
Bài 25:
Chú ý: làm bài tập tương tự với đồ thị có hướng
HD:
#include <stdio.h>
const max=30;//so dinh toi da
int n;//so dinh thuc su
int mtk[max][max];//mang chua ma tran ke
int stplt=0;//bien dem so thanh phan lien thong
//mang danh dau dinh da tham roi hay chua
//tham[i]=0 la i chua tham
//tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k
int tham[max];
char *dothi="d:dothi.in";
char *ketqua="d:ketqua.out";
void DocFile()
{ int i,j;
FILE *f=fopen(dothi,"r");//mo file dothi de doc
fscanf(f,"%d",&n);//doc so dinh cua do thi
//ban dau gan mtk=0
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) mtk[i][j]=0;
//lan luot doc cac canh (i,j) trong file
while(fscanf(f,"%d%d",&i,&j)!=EOF)
mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk
fclose(f);//dong file
}
void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i
{
tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt
for(int j=1;j<=n;j++)
if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i
DFS1(j);//tham j
}
void DFS()
{
//ban dau gan tat ca cac dinh la chua tham
for(int i=1;i<=n;i++) tham[i]=0;
for(i=1;i<=n;i++)//lan luot xet cac dinh i
if(tham[i]==0)//neu dinh i chua tham
{ stplt++;//tang so tplt
DFS1(i);//tham mot tplt chua i
}
}
void GhiFile()
{
FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi
if(stplt==1) fprintf(f,"Do thi lien thong");
else
{
fprintf(f,"Do thi khong lien thong");
for(int i=1;i<=stplt;i++)
{
fprintf(f,"nThanh phan lien thong thu %d:",i);
for(int j=1;j<=n;j++)
if(tham[j]==i)//neu j thuoc tplt thu i
fprintf(f,"%4d",j);//ghi j vao tplt thu i
}
}
fclose(f);
}
void main()
{
DocFile();
DFS();
GhiFile();
}
Bài 26
* Bài 1:
+ Câu a:
#include <iostream.h>
#include <stdlib.h>
const max=30;
void input(int a[], int &n)
{ cout<<"nNhap so phan tu:"; cin>>n; randomize();
for(int i=1;i<=n;i++) a[i]=random(20);
}
void output(int a[], int n)
{
for(int i=1;i<=n;i++) cout<<a[i]<<",";
}
//dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap
void adjust(int a[], int i, int n)
{ int x=a[i]; //cat a[i] vao bien x (bien tam)
int j=2*i; //a[j] la con cua a[i]
while(j<=n)
{ //neu a[i] co hai con thi chon a[j] la con lon nhat
if (j<n && a[j+1]>a[j]) j=j+1;
if (a[j]>x) //neu con cua a[i] la a[j] lon hon x
{
a[i]=a[j];//doi a[j] len vt a[i]
i=j;//lai xet pt a[i] moi
j=2*i;//a[j] la con cua a[i]
}
else break;//neu a[j]<=x thi ngung
}
a[i]=x;
}
void heapsort(int a[], int n)
{
/*
lan luot dieu chinh cac day
a[n/2],…,a[n]; a[n/2 + 1],…,a[n]; a[1],…,a[n]
thanh heap
*/
for(int i=n/2;i>=1;i--)
{ adjust(a,i,n);
cout<<"ni="<<i<<": ";output(a,n);
}
//lan luot dua pt lon nhat xuong vt a[n],…,a[2] bang cach hoan vi voi a[1]
//sau do giam n va lai dieu chinh a[1] den a[n] thanh heap
for(int j=n;j>=2;j--)
{ int x=a[1]; a[1]=a[j]; a[j]=x; //hoan vi a[j] voi a[1]
adjust(a,1,j-1);//dieu chinh day a[1],…,a[j-1] thanh heap
cout<<"nj="<<j<<": ";output(a,n);
}
}
void main()
{ int a[max],n;
input(a,n);
cout<<"nDay truoc khi sx:"; output(a,n);
heapsort(a,n);
cout<<"nDay sau khi sx:"; output(a,n);
}
+ Câu b:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
const max=50;
void input(int a[], int &n)
{ cout<<endl<<"Nhap so phan tu:"; cin>>n;
randomize();
for(int i=1;i<=n;i++) a[i]=random(max);
}
void output(int a[], int n)
{
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}
int sub_max(int a[], int n, int j)
{ int k=0;
if(j<=n)
{ k=j;
if (j+1<=n&&a[j+1]>a[k]) k=j+1;
if (j+2<=n&&a[j+2]>a[k]) k=j+2;
}
return k;
}
void Adjust(int a[], int i, int n)
{ int x=a[i];
while(1)
{ int k=sub_max(a,n,3*i-1);
if(k==0||a[k]<x) break;
a[i]=a[k]; i=k;
}
a[i]=x;
}
void HeapSort(int a[], int n)
{ for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n);
for(int j=n;j>=2;j--)
{ int x=a[1]; a[1]=a[j]; a[j]=x;
Adjust(a,1,j-1);
}
}
void main()
{ int a[max],n;
input(a,n);
cout<<endl<<"Day truoc khi sap:"<<endl;
output(a, n);
HeapSort(a,n);
cout<<endl<<"Day sau khi sap:"<<endl;
output(a, n);
}
Bài 27:
* Bài 2:
include <iostream.h>
#include <stdlib.h>
//#include <conio.h>
const max=50;
struct datatype
{ int l,r;
};
struct node
{ datatype data;
node * next;
};
typedef node* nodeptr;
void push(nodeptr &s, datatype x)
{ nodeptr p=new node;
p->data=x;p->next=s;s=p;
}
datatype pop(nodeptr &s)
{ if(s==NULL) {cout<<"nStack is empty!"; exit(1);}
nodeptr p=s; datatype x=p->data;
s=s->next; delete p;return x;
}
void input(int a[], int &n)
{ cout<<endl<<"Nhap so phan tu:"; cin>>n;
randomize();
for(int i=1;i<=n;i++) a[i]=random(max);
}
void output(int a[], int n)
{
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}
void quick_sort(int a[], int l, int r)
{ nodeptr s=NULL; datatype x,y;
x.l=l; x.r=r; push(s,x);
while(s!=NULL)
{ datatype x=pop(s);
int t=a[(x.l+x.r)/2],i=x.l,j=x.r;
do
{ while(a[i]<t) i++;
while(a[j]>t) j--;
if(i<=j)
{ int temp=a[i];a[i]=a[j]; a[j]=temp;
i++; j--;
}
}while(i<=j);
if (x.l<j){y.l=x.l;y.r=j;push(s,y);}
if (i<x.r){y.l=i;y.r=x.r; push(s,y);}
}
}
void main()
{ int a[max],n,m;char ans;
do
{ input(a,n);
cout<<endl<<"Day so truoc khi sap:"<<endl;
output(a, n);quick_sort(a,1,n);
cout<<endl<<"Day so sau khi sap:"<<endl;
output(a, n);
cout<<"nTiep khong (c/k)?:"; cin>>ans;
}while(ans=='c'||ans=='C');
}
Bài 28
* Bài 3:
//tron tu nhien ba bang hai giai doan tren file
#include <stdio.h>
#include <stdlib.h>
//tao file chua n so nguyen ngau nhien tu 0 den 19
void WriteFile(char *filename, int n)
{
FILE *f; int i;
f=fopen(filename,"w");
randomize();
for (i=1;i<=n;i++)
fprintf(f,"%d ",random(20));
fclose(f);
}
//doc file chua cac so nguyen hien ra man hinh
void ReadFile(char *filename)
{
FILE *f; int x;
f=fopen(filename,"r");
printf("n");
while (fscanf(f,"%d",&x)!=EOF)
printf("%d ",x);
fclose(f);
}
//doc mot so tu file f1 ghi vao file f2,
//neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc
//thi doan con trong file f1 da het, gan endsub=1
void CopyRecord(FILE *f1,FILE *f2, int &endsub)
{
int n,m; long p1,p2;
endsub=0;
if (fscanf(f1,"%d",&n)!=EOF)
{
fprintf(f2,"%d ",n);
fgetpos(f1,&p1);
if (fscanf(f1,"%d",&m)==EOF) endsub=1;
else
{
if (m<n) endsub=1;
fsetpos(f1,&p1);
}
}
else endsub=1;
}
//chep mot doan con tu f1 vao f2
void CopySub(FILE *f1,FILE *f2)
{
int endsub=0;
while (!endsub)
CopyRecord(f1,f2,endsub);
}
//tach filename thanh filename1 va filename2
void Split(char *filename, char *filename1, char *filename2)
{
int flag,n,n1; FILE *f,*f1,*f2;
f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w");
flag=1;
while (!feof(f))
{
if (flag) CopySub(f,f1);
else CopySub(f,f2);
flag=1-flag;
}
fclose(f);fclose(f1);fclose(f2);
}
//tra ve so nguyen ma con tro f dang tro toi
//neu con tro o cuoi file thi gan endsub=1
int CurRecord(FILE *f, int &endsub)
{
int n; long p;
endsub=0;
fgetpos(f,&p);
if (fscanf(f,"%d",&n)==EOF) endsub=1;
else fsetpos(f,&p);
return n;
}
//tron filename1 va filename2, ghi vao filename
int Merge(char *filename1, char *filename2, char *filename)
{
FILE *f, *f1, *f2;
int numsub,endsub1,endsub2,n1,n2;
f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w");
numsub=0;
while (!feof(f1)||!feof(f2))
{
endsub1=endsub2=0;
do
{
n1=CurRecord(f1,endsub1);
n2=CurRecord(f2,endsub2);
if (!endsub1&&!endsub2)
{
if (n1<n2) CopyRecord(f1,f,endsub1);
else CopyRecord(f2,f,endsub2);
}
}while(!endsub1 && !endsub2);
if (!endsub1) CopySub(f1,f);
else if (!endsub2) CopySub(f2,f);
numsub++;
}
while (!feof(f1))
{
CopySub(f1,f);
numsub++;
}
while (!feof(f2))
{
CopySub(f2,f);
numsub++;
}
fclose(f);fclose(f1);fclose(f2);
return numsub;
}
void MergeSort(char *filename)
{
char *filename1="d:temp1.txt", *filename2="d:temp2.txt";
int numsub;
do
{
Split(filename,filename1,filename2);
numsub=Merge(filename1,filename2,filename);
}while(numsub>1);
}
void main()
{
char *filename="d:test.txt";
char *filename1="d:temp1.txt";
char *filename2="d:temp2.txt";
int n;
printf("nNhap so phan tu cua day so:");
scanf("%d",&n);
WriteFile(filename,n);
ReadFile(filename);
MergeSort(filename);
ReadFile(filename);
}
Bài 29:
* Bài 4
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct sinhvien
{
char masv[10];
int diemthi;
};
int Eof(FILE *f)
{
fpos_t fpos; sinhvien sv;
int num;//so sv doc duoc phai la 1, neu la 0 thi het file
fpos=ftell(f);
num=fread(&sv,sizeof(sv),1,f);
fseek(f,fpos,0);
return (num==0)?1:0;
}
void RandomFileSV(char *filename, int n)
{
FILE *f=fopen(filename,"wb");
sinhvien sv; char index[5];
randomize();
for(int i=1;i<=n;i++)
{
itoa(i,index,10);
strcpy(sv.masv,"DH08");
if (i<10) strcat(sv.masv,"0");
strcat(sv.masv,index);
sv.diemthi= random(11);
fwrite(&sv,sizeof(sv),1,f);
}
fclose(f);
}
void PrintFileSV(char *filename)
{
FILE *f=fopen(filename,"rb");
sinhvien sv;
//neu het file fread tra ve 0
while(!Eof(f))
{
fread(&sv,sizeof(sv),1,f);
printf("n%-10s%4d",sv.masv,sv.diemthi);
}
fclose(f);
}
int CurrentRecord(FILE* f)
{
fpos_t fpos; sinhvien sv;
fpos=ftell(f);
fread(&sv,sizeof(sv),1,f);
fseek(f,fpos,0);
return sv.diemthi;//tra ve diem thi cua sv hien hanh
}
int CopyRecord(FILE* f1, FILE* f2)
{
int n; sinhvien sv;
if (!Eof(f1))
{
fread(&sv,sizeof(sv),1,f1);
fwrite(&sv,sizeof(sv),1,f2);
}
if (Eof(f1)) return 1;
else return (CurrentRecord(f1)<sv.diemthi)?1:0;
//1 la kt doan con hoac het file
}
void CopySubFile(FILE *f1, FILE *f2)
{
while(!CopyRecord(f1,f2));
}
void SplitFile(char *filename,char *filename1, char *filename2)
{
FILE *f,*f1,*f2; int filenum;
f=fopen(filename,"rb");f1=fopen(filename1,"wb");
f2=fopen(filename2,"wb");
filenum=1;
while(!Eof(f))
{
if (filenum==1) CopySubFile(f,f1);
else CopySubFile(f,f2);
filenum=3-filenum;
}
fclose(f);fclose(f1);fclose(f2);
}
int MergeFile(char *filename1,char *filename2,char *filename)
{
FILE *f,*f1,*f2;
int numsubfile,endsubfile1,endsubfile2;
numsubfile=0;
f1=fopen(filename1,"rb");f2=fopen(filename2,"rb");
f=fopen(filename,"wb");
while(!Eof(f1)&&!Eof(f2))
{
endsubfile1=endsubfile2=0;
do
{
if (CurrentRecord(f1)<CurrentRecord(f2))
endsubfile1=CopyRecord(f1,f);
else
endsubfile2=CopyRecord(f2,f);
}while(!endsubfile1&&!endsubfile2);
if (!endsubfile1) CopySubFile(f1,f);
else
if (!endsubfile2) CopySubFile(f2,f);
numsubfile++;
}
while(!Eof(f1))
{
CopySubFile(f1,f);
numsubfile++;
}
while(!Eof(f2))
{
CopySubFile(f2,f);
numsubfile++;
}
fclose(f);fclose(f1);fclose(f2);
return numsubfile;
}
void MergeSort(char *file)
{
char *file1="d:test1.dat";
char *file2="d:test2.dat";
int numsubfile=0;
do
{
SplitFile(file,file1,file2);
numsubfile=MergeFile(file1,file2,file);
}while(numsubfile>1);
remove(file1);remove(file2);
}
void main()
{
char *filename="d:test.dat";
clrscr();
RandomFileSV(filename,10);
printf("nFile sv truoc khi sap xep:");
PrintFileSV(filename);
MergeSort(filename);
printf("nFile sv sau khi sap xep:");
PrintFileSV(filename);
getch();
}
BÀI TẬP 77: Cài đặt thuật toán Ford-Fulkerson
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
const max=20;
int dsc[max][4],c[max][max],f[max][max];
int p[max],d[max],tham[max],m,n,s,t;
char *tenfile="d:/fordfulk.txt";
//doc d/s cung tu file, m la so cung, n la so dinh
void Doc_File_DSC()
{
FILE *f=fopen(tenfile,"r");
if (f==NULL)
{
printf("nFile %s khong co",tenfile); exit(0);
}
fscanf(f,"%d%d%d%d",&n,&m,&s,&t);
for (int i=1; i<=m; i++)
{
fscanf(f,"%d%d%d%d",&(dsc[i][0]),&(dsc[i][1]),&(dsc[i][2]),&(dsc[i][3]));
}
fclose(f);
}
const vc=100; //vo cuc
//Chuyen danh sach cung sang ma tran ke co huong
void Chuyen_DSC_MTK()
{
int i,j,k;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{ c[i][j]=f[i][j]=0;}
for (k=1; k<=m; k++)
{
i=dsc[k][0],j=dsc[k][1]; c[i][j]=dsc[k][2];f[i][j]=dsc[k][3];
}
}
//tim duong tang luong
int Find_Path()
{
int u,v,queue[max],dau,cuoi;
for (v=1;v<=n;v++) tham[v]=0;
queue[1]=s;p[s]=s;d[s]=vc;tham[s]=1;
dau=1; cuoi=2;
while (dau!=cuoi)
{
u=queue[dau++];
for (v=1;v<=n;v++)
{
if (!tham[v])
{
if (c[u][v]>0 && f[u][v]<c[u][v]) // Gf co cung thuan (u,v)
{
p[v]=u; d[v]=(d[u]<c[u][v]-f[u][v])?d[u]:(c[u][v]-f[u]
[v]);
if (v == t) return 1;
queue[cuoi++]=v; tham[v]=1;
}
if (c[v][u]>0 && f[v][u]>0) //co cung nghich (u,v)
{
p[v]=-u; d[v]=(d[u]<f[v][u])?d[u]:f[v][u];
if (v == t) return 1;
queue[cuoi++]=v; tham[v]=1;
}
}
}
}
return 0;
}
//tang luong
void Inc_Flow()
{
int u,v,tang;
v=p[t]; u=t; tang=d[t];
while (u!=s)
{
if (v>0) f[v][u]=f[v][u]+tang;
else
{
v=-v; f[u][v]=f[u][v]-tang;
}
u=v; v= p[u];
}
}
void Max_Flow()
{
int u,v,stop,sum;
stop=0;
while (!stop)
if (Find_Path()) Inc_Flow(); else stop=1;
printf("Luong cuc dai:");
for (u=1;u<=n;u++)
{
printf("n");
for (v=1;v<=n;v++)
{
printf("%d ",f[u][v]);
}
}
sum=0;
for (u=1;u<=n;u++)
if (c[s][u]>0) sum+=f[s][u];
printf("nnGia tri luong cuc dai:%d",sum);
printf("nnLat cat:");
printf("nVT:");
for (u=1;u<=n;u++)
if (tham[u]) printf("%d ",u);
printf("nVVT:");
for (u=1;u<=n;u++)
if (!tham[u]) printf("%d ",u);
}
void main()
{
clrscr();
Doc_File_DSC();
Chuyen_DSC_MTK();
Max_Flow();
getch();
}
Bài 30
HD:
//tim cay khung nho nhat tren do thi lien thong
#include <stdio.h>
#include <conio.h>
const max=30;//so dinh toi da
const vc=1000;//gia tri vo cuc
int n;//so dinh thuc su
int s;//dinh xuat phat
int mtk[max][max];//mang chua ma tran ke
int tham[max];//tham[i]=0 la i chua tham,tham[i]=1 la i tham roi
int d[max];//d[i] kcnn tu i den cay khung
int gan[max];//gan[i]=j nghia la j la dinh cua cay khung gan i nhat
int canhck[max][3];//mang luu canh cay khung
int m=0;//so canh cay khung
int cd=0;//chieu dai cay khung
char *dulieu="d:caykhung.in";
char *ketqua="d:caykhung.out";
void DocFile()
{ int i,j,k;
FILE *f=fopen(dulieu,"r");//mo file du lieu de doc
fscanf(f,"%d%d",&n,&s);//doc so dinh n va dinh xuat phat s
//gan tri ban dau cho mtk
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) mtk[i][j]=0; else mtk[i][j]=vc;
//lan luot doc tu file cac canh(i,j) co trong so k
while(fscanf(f,"%d%d%d",&i,&j,&k)!=EOF)
mtk[i][j]=mtk[j][i]=k;//gan k vao vi tri tuong ung trong mtk
fclose(f);//dong file
}
void Prim()//tim cay khung nn voi s la dinh xuat phat
{ int i,j,u,v,min;
for(i=1;i<=n;i++)
{
d[i]=mtk[s][i];gan[i]=s;tham[i]=0;
}
tham[s]=1;//danh dau s tham roi
for(i=1;i<=n-1;i++)//lan luot tham n-1 dinh con lai
{
//tim dinh u chua tham va co d[u] nho nhat de tham
min=vc;
for(j=1;j<=n;j++)
if(tham[j]==0&&d[j]<min)//neu j chua tham va d[j]<min
{ u=j;
min=d[j];
}
tham[u]=1;++m;
canhck[m][1]=u;canhck[m][2]=gan[u];canhck[m][3]=mtk[u][gan[u]];
cd=cd+canhck[m][3];
//cap nhat cac dinh v chua tham va v ke u
for(v=1;v<=n;v++)
if(tham[v]==0&&mtk[u][v]!=vc)
if(d[v]>mtk[u][v])
{
d[v]=mtk[u][v];gan[v]=u;
}
}
}
void GhiFile()
{
FILE *f=fopen(ketqua,"w");
int i,j,k;
fprintf(f,"%dt%d",m,cd);
for(i=1;i<=m;i++)
fprintf(f,"n%dt%dt%d",canhck[i][1],canhck[i][2],canhck[i][3]);
fclose(f);
}
void main()
{
DocFile();
Prim();
GhiFile();
}
Bài 31
Bài giải 31:
HD:
#include <stdio.h>
#include <math.h>
#include <conio.h>
const max=30;
int a=3,b=6;
int X[max];//chua so can tim: x1x2...xn (a<=n<=b)
int S,P,B;
int count=0;
long K=0;
void tinhK(int i)//tinh K co i chu so X1X2...Xi
{ long q=1;K=0;
for(int j=i;j>0;j--)
{
K=K+q*X[j];q=q*10;
}
}
int ktnt()//kiem tra K co la nguyen to kg?
{ int nt=1;
for(long i=2;i<=sqrt(K);i++)
if(K%i==0) {nt=0;break;}
return nt;
}
//kiem tra xem K=x1...xi co tong x1+...+xi co chia het cho S hay kg?
int kttong(int i)
{ long M=0;//M la tong cac chu so cua K
for(int j=1;j<=i;j++) M=M+X[j];
if (M%S==0) return 1;
else return 0;
}
//kiem tra K bieu dien o co so B co la so thuan nghich hay kg?
int kttn()
{ int d[max];//dm...d1 la bieu dien o co so B cua K
long T=K; int m=0;
do
{ d[++m]=T%B;T=T/B;
}while(T!=0);
int tn=1;
for(int i=1;i<=m/2;i++)
if(d[i]!=d[m-i+1]) {tn=0;break;}
return tn;
}
void Try(int i)
{ for(int j=0;j<=9;j++)
{ if((i!=1&&j!=P)||(i==1&&j!=0&&j!=P))
{
X[i]=j;
if(i>=a&&i<=b)
{ tinhK(i);
if(ktnt()==1&&kttong(i)==1&&kttn()==1)
{
printf("n%d)%ld",++count,K);
if(count%20==0) getch();
}
}
if(i<b) Try(i+1);
}
}
}
void main()
{
printf("n1.K co %d den %d chu so",a,b);
printf("n2.K la so nguyen to");
printf("n3.Cac chu so cua K phai khac P");
printf("n4.Tong cac chu so cua K phai chia het cho S");
printf("n5.Bieu dien theo co so B cua K phai la day thuan nghich");
printf("nNhap P(0->9):");scanf("%d",&P);
printf("Nhap S:");scanf("%d",&S);
printf("Nhap co so B:");scanf("%d",&B);
Try(1);
}
BÀI TẬP 82: Bài toán mã đi tuần
Mã nguồn:
#include<iostream>
using namespace std;
int bc[100][100];
int lechX[8] = {2,1,-1,-2,-2,-1,1,2};
int lechY[8] = {1,2,2,1,-1,-2,-2,-1};
int n;
void init(){
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++)
bc[i][j] = 0;
}
void print(){
cout<<"Thu tu cac buoc di cua quan ma: n";
for(int i=0; i<n; i++){
for(int j=0; j<n; j++)
cout<<bc[i][j]<<" ";
cout<<endl;
}
}
void knightTour(int j,int x, int y){
int u,v;
for(int i = 0 ;i<8; i++){
u = x + lechX[i];
v = y + lechY[i];
if(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 ){
bc[u][v] = j;
if (j==n*n) print();
else knightTour(j+1,u,v);
bc[u][v] = 0;
}
}
}
void main(){
cout<<"Nhap n= ";
cin>>n;
init();
int x0= 4, y0=4;
bc[x0][y0]=1;
knightTour(2,x0,y0);
cout<<endl;
system("PAUSE");
}
Các pác có biết input như thế nào có thể cho ra output hông?
Hông biết code của mình có vấn đề hay không mà chạy hoài không có output nào cả.
Mình thấy bạn nhầm ở điều kiện
if(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 )
Ở đây bc[x][y] nên được sửa thành bc[u][v].
Thêm nữa, có lẽ bạn chọn vị trí không tốt nên chạy không ra kết quả. Mình sửa hàm
KnightTour thành:
Mã nguồn:
void KnightTour(int j, int x, int y)
{
int u,v;
if (j > n*n)
{
print();
}
else
{
for (int i = 0 ;i < 8; i++)
{
u = x + lechX[i];
v = y + lechY[i];
if (0 <= u && u < n && 0 <= v && v < n && bc[u][v] == 0)
{
bc[u][v] = j;
knightTour(j+1, u, v);
bc[u][v] = 0;
}
}
}
}
và đặt x0 = 0, y0 = 0 thì chạy cho ra vô số kết quả với n = 8.
--------------------------------------------------------------------------------------------------------------
Công thức truy hồi
Xem các dãy số {xn}, {yn}, {zn} được cho theo công thức như sau:
x0=y0=z0=1
với n>=1 thì:
xn=xn-1 + 2yn-1 + 3zn-1
yn=4xn-1 + 5yn-1 + 6zn-1
zn=7xn-1 + 8yn-1 + 9zn-1
Hãy viết hàm (không đệ quy) để tính giá trị của xn, yn, zn khi biết n (nguyên không âm).
Hàm này mô tả như sau:
void EvaluateXYZ(int n, float& x, float& y, float& z);
Trong đó, các tham biến x, y, z nhận về các giá trị tương ứng của xn, yn, zn.
Bài này đơn giản là dùng 3 biến để lưu giá trị trước như sau:
Mã nguồn:
void EvaluateXYZ(int n, float &x, float &y, float &z) {
float x0 = x = 1, y0 = y = 1, z0 = z = 1;
for (int i=1; i<=n; i++) {
x = x0 + 2*y0 + 3*z0;
y = 4*x0 + 5*y0 + 6*z0;
z = 7*x0 + 8*y0 + 9*z0;
x0 = x;
y0 = y;
z0 = z;
}
}
Bài 35
HD:
#include <stdio.h>
const max=30;//so dinh toi da
int n;//so dinh thuc su
int mtk[max][max];//mang chua ma tran ke
int stplt=0;//bien dem so thanh phan lien thong
//mang danh dau dinh da tham roi hay chua
//tham[i]=0 la i chua tham
//tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k
int tham[max];
char *dothi="d:dothi.in";
char *ketqua="d:ketqua.out";
void DocFile()
{ int i,j;
FILE *f=fopen(dothi,"r");//mo file dothi de doc
fscanf(f,"%d",&n);//doc so dinh cua do thi
//ban dau gan mtk=0
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) mtk[i][j]=0;
//lan luot doc cac canh (i,j) trong file
while(fscanf(f,"%d%d",&i,&j)!=EOF)
mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk
fclose(f);//dong file
}
void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i
{
tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt
for(int j=1;j<=n;j++)
if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i
DFS1(j);//tham j
}
void DFS()
{
//ban dau gan tat ca cac dinh la chua tham
for(int i=1;i<=n;i++) tham[i]=0;
for(i=1;i<=n;i++)//lan luot xet cac dinh i
if(tham[i]==0)//neu dinh i chua tham
{ stplt++;//tang so tplt
DFS1(i);//tham mot tplt chua i
}
}
void GhiFile()
{
FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi
if(stplt==1) fprintf(f,"Do thi lien thong");
else
{
fprintf(f,"Do thi khong lien thong");
for(int i=1;i<=stplt;i++)
{
fprintf(f,"nThanh phan lien thong thu %d:",i);
for(int j=1;j<=n;j++)
if(tham[j]==i)//neu j thuoc tplt thu i
fprintf(f,"%4d",j);//ghi j vao tplt thu i
}
}
fclose(f);
}
void main()
{
DocFile();
DFS();
GhiFile();
}
BÀI TẬP 84: Bài toán cái túi
#include <stdio.h>
#include <conio.h>
//c[i]: gia tri su dung cua vat loai i, a[i]: trong luong vat loai i
float c[100],a[100];
//x: chua phuong an trung gian, xopt: phuong an toi uu
int x[100],xopt[100];
//d: so thu tu cua loai i la d[i]
int d[100],n;//n la so loai vat
/*w la trong luong toi da tui co the chua,
weight: trong luong hien tai cua tui
fopt: gia tri hien tai lon nhat cua tui
cost: gia tri hien tai
*/
float w,weight,fopt,cost;
/* file caitui.dat co dang sau:
4 8 //n=4, b=8
5 3 2 4 //a: trong luong moi loai vat
10 5 3 6 //c: gia tri moi loai vat
*/
void ReadFile()
{
FILE *fin;
int i;
if ((fin = fopen("caitui.dat", "rt"))== NULL)
{
printf("Khong tim thay file caitui.dat.n");
return ;
}
fscanf(fin,"%d%f",&n,&w);
for (i=0;i<n;i++) fscanf(fin,"%f",&a[i]);
for (i=0;i<n;i++) fscanf(fin,"%f",&c[i]);
fclose(fin);
printf("nSo loai vat:%d",n);
printf("nTrong luong cai tui:%0.0f",w);
printf("nTrong luong cac loai vat:");
for (i=0;i<n;i++) printf("%0.0f ",a[i]);
printf("nGia tri cac loai vat:");
for (i=0;i<n;i++) printf("%0.0f ",c[i]);
}
void Init()
{
int i,j,k,t;
fopt=0;// gia tri lon nhat =0
weight=0;//trong luong ban dau cua tui=0;
for (i=0; i<n; i++)
d[i]=i+1;
for (i=0; i<n-1; i++)
{
k=i;
for (j=i+1; j<n; j++)
if (c[j]/a[j]>c[k]/a[k]) k=j;
if (k!=i)
{
t=a[i];a[i]=a[k];a[k]=t;
t=c[i];c[i]=c[k];c[k]=t;
t=d[i];d[i]=d[k];d[k]=t;
}
}
}
void KyLuc()
{
if (cost>fopt)
{
for (int i=0; i<n; i++)
{
xopt[i]=x[i]; fopt=cost;
}
}
}
void Try(int i)
{
int j,t;
t=(w-weight)/a[i];//w: suc chua cua tui
for (j=t; j>=0; j--)
{
x[i]=j;
weight=weight+a[i]*x[i];//weight:trong luong tui
cost=cost+c[i]*x[i];//cost: gia tri tui
if (i==n-1) KyLuc();
else
if (cost+c[i+1]*(w-weight)/a[i+1]>fopt) Try(i+1);
weight=weight-a[i]*x[i];
cost=cost-c[i]*x[i];
}
}
void InKq()
{
printf("nTong gia tri do vat:%0.0f",fopt);
for (int i=0; i<n; i++)
printf("nso luong do vat loai %d la %d",d[i],xopt[i]);
}
void main()
{
clrscr();
ReadFile();
Init();
Try(0);
InKq();
getch();
}
BÀI TẬP 85: Bài toán người du lịch
#include <stdio.h>
#include <conio.h>
#include <values.h>
int n;//so thanh pho
int c[100][100];//ma tran chi phi
int cmin;//chi phi nho nhat trong ma tran chi phi
int tp[100];//tp[i]=0:tp i da di qua, =1 chua di qua
int cost;//chi phi bo phan
int fopt; //gia tri ky luc, gia tri cuoi cung la gia tri toi uu
int x[100];//la mot phuong an
int xopt[100];//la phuong an toi uu
void ReadFile()
{
FILE *fin;
int i,j;
if ((fin = fopen("dulich.dat", "rt"))== NULL)
{
printf("Khong tim thay file dulich.dat.n");
return ;
}
//doc so thanh pho
fscanf(fin,"%d",&n);
//doc ma tran chi phi
for (i=0;i<n;i++)
for (j=0;j<n;j++)
fscanf(fin,"%d",&c[i][j]);
fclose(fin);
//xuat thong tin de kiem tra
printf("nSo thanh pho:%d",n);
printf("nMa tran chi phi:");
for (i=0;i<n;i++)
{
printf("n");
for (j=0;j<n;j++)
printf("%3d",c[i][j]);
}
}
void Init()
{
int i,j;
cmin=MAXINT;//so kieu int lon nhat
for (i=0;i<n;i++)
{
tp[i]=1;//tat ca tp i deu chua di qua
for (j=0;j<n;j++)//tim cmin
if ( (i!=j)&&(c[i][j]<cmin)) cmin=c[i][j];
}
fopt=MAXINT;//ky luc ban dau
cost=0;//chi phi bo phan
x[0]=0;//tp bat dau di la tp 0
}
void CNKL() //cap nhat ky luc
{
int i,s;
s=cost+c[x[n-1]][x[0]];//cong them chi phi tro ve tp dau
if (s<fopt)//neu chi phi cua hanh trinh nay < ky luc
{
fopt=s;//ghi nhan ky luc moi
for (i=0;i<n;i++) xopt[i]=x[i]; //ghi nhan hanh trinh moi
}
}
void Try(int i)
{
int j;
for (j=1;j<n;j++)
if (tp[j])
{
x[i]=j;
tp[j]=0;//tp j da duoc chon
cost=cost+c[x[i-1]][x[i]];//chi phi bo phan
if (i==n-1) CNKL();
else
if (cost+(n-i+1)*cmin<=fopt) Try(i+1);
tp[j]=1;
cost=cost-c[x[i-1]][x[i]];
}
}
void Result()
{
int i;
printf("nnChi phi nho nhat:%d",fopt);
printf("nHanh trinh co chi phi nho nhat:n");
for (i=0;i<n;i++)
printf ("%d -> ",xopt[i]+1);
printf ("%d",xopt[0]+1);
}
void main()
{
clrscr();
ReadFile();
Init();
Try(1);
Result();
getch();
}
/*
vi du ve file dulich.dat
6
0 3 93 13 33 9
4 0 77 42 21 16
45 17 0 36 16 28
39 90 80 0 56 7
28 46 88 33 0 25
3 88 18 46 92 0
Co ds la:
Chi phi nho nhat:104
Hanh trinh co chi phi nho nhat:
1->4->6->3->2->5->1
BÀI TOÁN 86: Chuyển từ ma trận kề sang danh sách kề
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 10
char *dske="d:dske.out";
char *mtke="d:mtke.in";
char *dscanh="d:dscanh.out";
void chuyen_mtke()
{ int i,j,mtk[MAX][MAX],n,m=0;
FILE *fp;
fp = fopen(mtke,"r");
fscanf(fp,"%d",&n); //doc so dinh cua do thi
printf("n So dinh do thi:%d",n);
for(i=1; i<=n; i++)
for(j=1; j<=n;j++)
{ fscanf(fp,"%5d",&mtk[i][j]);
if(mtk[i][j]==1)
m++; // dem so canh cua do thi
}
fclose(fp);
printf("n Ma tran ke doc duoc:n");
for(i=1; i<=n; i++)
{ for(j=1;j<=n;j++)
printf("%5d",mtk[i][j]);
printf("n");
}
//ghi lai danh sach ke theo khuon dang
fp = fopen(dske,"w");
printf("n So dinh:%d",n);
fprintf(fp,"%5dn",n);
printf("n Danh sach ke:n");
for(i=1; i<=n; i++)
{ for(j=1;j<=n;j++)
if(mtk[i][j])
{printf("%5d",j);
fprintf(fp,"%5d",j);
}
printf("n");
fprintf(fp,"n");
}
fclose(fp);
//ghi lai danh sach canh theo khuon dang
m = m/2; //lay so canh cua do thi
fp = fopen(dscanh,"w");
fprintf(fp,"%d%5d",n,m);
printf("n So dinh : %d, so canh:%d",n,m);
printf("n Danh sach canh:");
for(i=1; i<n; i++){
for(j=i+1; j<=n; j++)
{ if(mtk[i][j])
{printf("n %3d%5d",i,j);
fprintf(fp,"n%d%5d",i,j);
}
}
fclose(fp);
}
void main()
{
chuyen_mtke();
getch();
}
BÀI TẬP 87: Chuyển từ danh sách canh sang ma trận kề, danh sách kề
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 10
char *dske="d:dske.out";
char *mtke="d:mtke.out";
char *dscanh="d:dscanh.in";
void chuyen_dscanh()
{ int i,j,dsc[MAX][MAX],mtk[MAX][MAX],n,m=0;
FILE *fp;
fp = fopen(dscanh,"r");
fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi
printf("n So dinh do thi:%d, so canh cua do thi:%d",n,m);
for(i=1; i<=m; i++)
for(j=1; j<=m/2;j++)
fscanf(fp,"%5d",&dsc[i][j]);//doc ds canh de in ra man hinh
fclose(fp);
printf("n Danh sach canh doc duoc:n");
for(i=1; i<=m; i++)
{ for(j=1;j<=m/2;j++)
printf("%5d",dsc[i][j]);
printf("n");
}
//bat dau gan ma tran ke =0
for(i=1; i<=n; i++)
for(j=1; j<=n;j++)
mtk[i][j]=0;
//lan luot doc cac canh (i,j) trong file
fp=fopen(dscanh,"r");
fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi
while(fscanf(fp,"%d%d",&i,&j)!=EOF)
mtk[i][j]=mtk[j][i]=1;
fclose(fp);
//ghi lai ma tran ke theo khuon dang
fp = fopen(mtke,"w");
printf("n So dinh:%d",n);
fprintf(fp,"%5dn",n);
printf("n Ma tran ke:n");
for(i=1; i<=n; i++)
{ for(j=1;j<=n;j++)
printf("%5d",mtk[i][j]);
fprintf(fp,"%5d",mtk[i][j]);
printf("n");
fprintf(fp,"n");
}
fclose(fp);
//ghi lai danh sach ke theo khuon dang
fp = fopen(dske,"w");
printf("n So dinh:%d",n);
fprintf(fp,"%5dn",n);
printf("n Danh sach ke:n");
for(i=1; i<=n; i++)
{ for(j=1;j<=n;j++)
if(mtk[i][j])
{printf("%5d",j);
fprintf(fp,"%5d",j);
}
printf("n");
fprintf(fp,"n");
}
fclose(fp);
}
void main()
{
chuyen_dscanh();
getch();
}
Bài 36
HD:
* Cach 1:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep
char *filename="d:data.in";
void DocFile()
{
FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
}
void KhoiTao()
{
FOPT = -32000; //gan gia tri toi uu ban dau
//gan phuong an hien tai ban dau: x1=x2=...=xn=0
//va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0
for(int i=1; i<=n; i++)
{
X[i]=0;
XOPT[i]=0;
}
}
void DayNhiPhanKe()//tim day nhi phan ke tiep
{
int i=n;
while(i>0 && X[i]==1) {X[i]=0;i--;}
if( i==0) stop=1;
else X[i]=1;
}
void CapNhatPATU()//cap nhat phuong an toi uu
{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai
//S la tong trong luong cac vat ung voi phuong an hien tai
//P la tong gia tri cac vat ung voi phuong an hien tai
int S=0, P=0;
for( int i=1; i<=n ; i++)//tinh S va P
{
S = S + A[i] * X[i];
P = P + C[i] * X[i];
}
//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui
//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat
if ( S<=B && FOPT < P)
{
FOPT = P; // Cap nhat gia tri toi uu moi
for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi
XOPT[i] = X[i];
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{
printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile(); KhoiTao();
while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an
{
CapNhatPATU();
DayNhiPhanKe();
}
GhiFile();
}
* Cach 2:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
char *filename="d:data.in";
void DocFile()
{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
FOPT = -32000; //gan gia tri toi uu ban dau
}
void CapNhatPATU()//cap nhat phuong an toi uu
{ //X1,...,Xn la day nhi phan ung voi phuong an hien tai
//S la tong trong luong cac vat ung voi phuong an hien tai
//P la tong gia tri cac vat ung voi phuong an hien tai
int S=0, P=0;
for( int i=1; i<=n ; i++)//tinh S va P
{
S = S + A[i] * X[i];
P = P + C[i] * X[i];
}
//Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui
//va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat
if ( S<=B && FOPT < P)
{ FOPT = P; // Cap nhat gia tri toi uu moi
for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi
XOPT[i] = X[i];
}
}
void Try(int i)//lan luot xet tat ca cac phuong an
{
for(int j=0;j<=1;j++)
{
X[i]=j;
if(i==n) CapNhatPATU();
else Try(i+1);
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{
printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile();
Try(1);
GhiFile();
}
* Cach 3:
#include <stdio.h>
#include <conio.h>
#define MAX 100//so vat toi da
int n;//so vat thuc su
int B;//suc chua cai tui
int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
//mot phuong an la mot day nhi phan x1,...,xn (xi=0/1)
int X[MAX];//mang chua phuong an hien tai
//phuong an toi uu la phuong an cho gia tri lon nhat
int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1
//gia tri toi uu la gia tri su dung ung voi phuong an toi uu
int FOPT;//mang chua gia tri toi uu
char *filename="d:data.in";
int S=0,P=0;
void DocFile()
{ FILE *fp = fopen(filename,"r");//mo file du lieu de doc
fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
printf("n So vat:%d",n);
printf("n suc chua cai tui:%d",B);
printf("n gia tri cua moi vat:");
for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn
{
fscanf(fp,"%d",&C[i]);
printf("%4d",C[i]);
}
printf("n trong luong cua moi vat:");
for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an
{
fscanf(fp,"%d",&A[i]);
printf("%4d",A[i]);
}
fclose(fp);
FOPT = -32000; //gan gia tri toi uu ban dau
}
void Try(int i)//lan luot xet tat ca cac phuong an
{
for(int j=0;j<=1;j++)
{
X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i];
if(i==n)
{
if ( S<=B && FOPT < P)
{ FOPT = P; //Cap nhat gia tri toi uu moi
for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi
XOPT[k] = X[k];
}
}
else
if(S<B) Try(i+1);
S=S-A[i]*X[i];P=P-C[i]*X[i];
}
}
void GhiFile()
{ // Dua ra ket qua toi uu
FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi
fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
printf("n Gia tri toi uu :%d", FOPT);
printf("n Phuong an toi uu:");
for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file
{ printf("%3d",XOPT[i]);
fprintf(fp,"%3d",XOPT[i]);
}
fclose(fp);
}
void main()
{
DocFile();
Try(1);
GhiFile();
}
Bài 38
#include <stdio.h>
#include <math.h>
#include <conio.h>
int count=0;
/* kiem tra K co la nguyen to kg? */
int ktnt(long K)
{ int nt=1;
if(K==1)
nt=0;
for(long i=2;i<=sqrt(K);i++)
if(K%i==0) {nt=0;break;}
return nt;
}
/* ktra cac chu so cua K khac 0 va nguyen to */
int ktChuso(long K)
{int cs,flag=1;
while(K>0)
{
cs=K%10;
K=K/10;
if(cs==0||ktnt(cs)==0)
flag=0;
}
if(flag)
return 1;
else
return 0;
}
/* Kiem tra tong cac chu so cua K co la ngto */
int ktTong(long K)
{long M=0;//M la tong cac chu so cua K
int cs;
while(K>0)
{
cs=K%10;
K=K/10;
M+=cs;
}
if(ktnt(M))
return 1;
else
return 0;
}
/* Dao nguoc so K cung la ngto */
int ktDaoso(long K)
{int cs;
long Sodao=0;
while(K>0)
{
cs=K%10;
K=K/10;
Sodao=Sodao*10+cs;
}
if(ktnt(Sodao))
return 1;
else
return 0;
}
/* tim so K */
void TimK()
{
for(long K=10000;K<=99999;K++)
{ if(ktnt(K)==1&&ktTong(K)==1&&ktChuso(K)==1&&ktDaoso(K)==1)
{
printf("n%d)%ld",++count,K);
if(count%20==0) getch();
}
}
}
void main()
{
printf("n1.K la so co 5 chu so");
printf("n2.K la so nguyen to");
printf("n3.Dao nguoc cac chu so cua K cung la so nguyen to");
printf("n4.Tong cac chu so cua K cung la so nguyen to");
printf("n5.Cac chu so trong K deu khac 0 va la so ngto 1 chu so");
TimK();getch();
}
bai 6 trang 103: vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3)
se co hai nghiem la: x=(1,0,1) va x=(1,1,0)
#include <stdio.h>
#include <conio.h>
int x[100],a[100],n,b,count,s;
void init()
{
printf("n="); scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("a%d=",i+1); scanf("%d",&a[i]);
}
printf("b="); scanf("%d",&b);
count=0; s=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=0; j<=1; j++)
{
if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b
{
x[i]=j; //xac dinh x[i]
s=s+a[i]*x[i]; //cap nhat bien trang thai s
if (i==n-1)
{
if (s==b) result();
}
else Try(i+1);
s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 7 trang 103
vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3)
se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)
#include <stdio.h>
#include <conio.h>
int x[100],a[100],n,b,count,s;
void init()
{
printf("n="); scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("a%d=",i+1);
scanf("%d",&a[i]);
}
printf("b="); scanf("%d",&b);
count=0; s=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan
{
if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b
{
x[i]=j; //xac dinh x[i]
s=s+a[i]*x[i]; //cap nhat bien trang thai s
if (i==n-1)
{
if (s==b) result();
}
else Try(i+1);
s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 9 trang 104
vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so
5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1
#include <stdio.h>
#include <conio.h>
int x[100],N,count,s,k,n;
void init()
{
printf("N="); scanf("%d",&N);
count=0; s=0; k=1; n=0;
}
void result()
{
count++;
printf("n%3d) ",count);
for (int i=0;i<n;i++) printf("%2d",x[i]);
}
void Try(int i)
{
for (int j=k; j<=N; j++)//cac kha nang cua x[i]
{
if (s<N)
{
x[i]=j; //xac dinh x[i]
s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n
if (s==N) result();
else if (s<N) Try(i+1);
s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}
bai 10 trang 104: hinh vuong than bi
Y tuong: (moi ma phuong la mot hoan vi)
- tim tat ca cac hoan vi cua tap {1,...,n*n}
- Kiem tra hoan vi nao la ma phuong thi in hoan vi do
#include <stdio.h>
#include <conio.h>
int x[100], b[100],n,count;
int a[10][10];
void init()
{
printf("n=");
scanf("%d",&n);
for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung
count=0;
}
int test() //kiem tra hoan vi co la ma phuong
{
int i, j, k, s, s0, s1, s2;
//doi hoan vi thanh ma tran de de kiem tra t/c ma phuong
i=0; j=0;
for (k=0;k<n*n;k++)
{
a[i][j]=x[k]; j++;
if (j==n) {i++; j=0;}
}
//kiem tra tong moi dong phai bang nhau
s0=0;//gia tri dong 0
for (j=0;j<n;j++)
s0=s0+a[0][j];
for (i=1;i<n;i++)
{
s=0;//gia tri dong i
for (j=0;j<n;j++)
s=s+a[i][j];
//neu dong i khac dong 0 thi khong phai ma phuong
if (s!=s0) return 0;
}
//kiem tra cot
s0=0;//gia tri cot 0
for (i=0;i<n;i++)
s0=s0+a[i][0];
for (j=1;j<n;j++)
{
s=0;//gia tri cot j
for (i=0;i<n;i++)
s=s+a[i][j];
//neu cot j khac cot 0 thi khong phai ma phuong
if (s!=s0) return 0;
}
//kiem tra duong cheo
s1=0,s2=0;
for (i=0;i<n;i++)
{
s1=s1+a[i][i];
s2=s2+a[i][n-1-i];
}
if (s1!=s2) return 0;
return 1; //hoan vi la ma phuong
}
void result()
{
if (test())
{
count++;
printf("nMa phuong %d:n",count);
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("n");
}
}
}
void Try(int i)
{
for (int j=0; j<n*n; j++)
{
if (b[j])
{
x[i]=j+1; b[j]=0;//j su dung roi
if (i==n*n-1) result();
else Try(i+1);
b[j]=1; //tra lai trang thai cu, j chua su dung
}
}
}
void main()
{
clrscr();
init();
Try(0);
getch();
}

More Related Content

DOCX
Vatesh
PDF
Chuong13
PDF
phuong trinh vi phan d geometry
PDF
Alat berat untuk proyek konstruksi
PDF
Chuong11
PDF
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.ir
PDF
Lab2 sdmp
DOC
Ngon ngu lap trinh
Vatesh
Chuong13
phuong trinh vi phan d geometry
Alat berat untuk proyek konstruksi
Chuong11
Sakhtoman dadeha 90-91 - nimsal 2 -F1notes.ir
Lab2 sdmp
Ngon ngu lap trinh

What's hot (18)

PDF
153 dreamweaver4
PDF
Уламжлал
PDF
10 geo1 dom
PDF
10 geo2 dom
PDF
Bai tap tham khao CSPE
PPTX
Ciclu eulerian
PDF
Chuong8
PDF
Chde giai tich12-hki
PDF
Luong giac chuong 7
PDF
Writeup ctf online idsecconf 2017
PDF
Lataif e ashrafi malfoozat e syed makhdoom ashraf 21
PDF
皆の日本語本冊初级2英語 translations & grammatical notes
PDF
Chuyen de phan nguyen phan le cua vu phong.doc
PDF
Bài tập tuần 2
DOC
Chuyen de bat dang thuc co ban danh cho thcs
PDF
20090315 hardnessvsrandomness itsykson_lecture03
PDF
Makalah game sudoku
153 dreamweaver4
Уламжлал
10 geo1 dom
10 geo2 dom
Bai tap tham khao CSPE
Ciclu eulerian
Chuong8
Chde giai tich12-hki
Luong giac chuong 7
Writeup ctf online idsecconf 2017
Lataif e ashrafi malfoozat e syed makhdoom ashraf 21
皆の日本語本冊初级2英語 translations & grammatical notes
Chuyen de phan nguyen phan le cua vu phong.doc
Bài tập tuần 2
Chuyen de bat dang thuc co ban danh cho thcs
20090315 hardnessvsrandomness itsykson_lecture03
Makalah game sudoku
Ad

More from Hồ Lợi (20)

PDF
Xu ly chuoi
DOC
Tóm tắt các hàm chuẩn của c
PDF
PDF
Nguyen lyoop
PDF
Lect04 functions
DOC
Ky thuatkhudequy
PDF
Itt epc assignment
DOC
Huong danontapc
DOC
H hai epc_baitap
PDF
Gtrinh oop
PDF
Giaotrinhbaitapkythuatlaptrinh
PDF
Giao trinh ky thuat lap trinh 2
PDF
Giao trinh c c++
PDF
File trong c_
PDF
Epc assignment
PDF
Epc test practical
DOC
De thic++ --th
DOC
Dethi c++ -lt
PDF
Debug trong c
PDF
D05 stl
Xu ly chuoi
Tóm tắt các hàm chuẩn của c
Nguyen lyoop
Lect04 functions
Ky thuatkhudequy
Itt epc assignment
Huong danontapc
H hai epc_baitap
Gtrinh oop
Giaotrinhbaitapkythuatlaptrinh
Giao trinh ky thuat lap trinh 2
Giao trinh c c++
File trong c_
Epc assignment
Epc test practical
De thic++ --th
Dethi c++ -lt
Debug trong c
D05 stl
Ad

Baitap ktlt code

  • 1. Bài 39 + Câu a: #include <iostream.h> #include <stdlib.h> const max=30; //Nhập mảng ngẫu nhiên void input(int a[], int &n) { cout<<"nNhap so phan tu:"; cin>>n; randomize(); for(int i=0;i<n;i++) a[i]=random(20); } //Xuất mảng void output(int a[], int n) { for(int i=0;i<n;i++) cout<<a[i]<<","; } //dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap void adjust(int a[], int i, int n) { int x=a[i]; int j=2*i,done=0; while(j<=n&&!done) { if(j<n&&a[j+1]>a[j]) j=j+1; if(a[j]>x) {a[i]=a[j];i=j;j=2*i;} else done=1; } a[i]=x; } void heapsort(int a[], int n) { for(int i=n/2;i>=1;i--) adjust(a,i,n); for(int j=n;j>=2;j--) { int x=a[1]; a[1]=a[j]; a[j]=x; adjust(a,1,j-1); } }
  • 2. void main() { int a[max],n; input(a,n); cout<<"nDay truoc khi sx:"; output(a,n); heapsort(a,n); cout<<"nDay sau khi sx:"; output(a,n); } + Câu b: #include <iostream.h> #include <stdlib.h> #include <conio.h> const max=50; void input(int a[], int &n) { cout<<endl<<"Nhap so phan tu:"; cin>>n; randomize(); for(int i=1;i<=n;i++) a[i]=random(max); } void output(int a[], int n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; } int sub_max(int a[], int n, int j) { int k=0; if(j<=n) { k=j; if (j+1<=n&&a[j+1]>a[k]) k=j+1; if (j+2<=n&&a[j+2]>a[k]) k=j+2; } return k; } void Adjust(int a[], int i, int n) { int x=a[i]; while(1) { int k=sub_max(a,n,3*i-1); if(k==0||a[k]<x) break; a[i]=a[k]; i=k;
  • 3. } a[i]=x; } void HeapSort(int a[], int n) { for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n); for(int j=n;j>=2;j--) { int x=a[1]; a[1]=a[j]; a[j]=x; Adjust(a,1,j-1); } } void main() { int a[max],n; input(a,n); cout<<endl<<"Day truoc khi sap:"<<endl; output(a, n); HeapSort(a,n); cout<<endl<<"Day sau khi sap:"<<endl; output(a, n); } Bài 2: Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp dãy số trên file. //tron tu nhien ba bang hai giai doan tren file #include <stdio.h> #include <stdlib.h> //tao file chua n so nguyen ngau nhien tu 0 den 19 void WriteFile(char *filename, int n) { FILE *f; int i; f=fopen(filename,"w"); randomize(); for (i=1;i<=n;i++) fprintf(f,"%d ",random(20)); fclose(f); } //doc file chua cac so nguyen hien ra man hinh void ReadFile(char *filename)
  • 4. { FILE *f; int x; f=fopen(filename,"r"); printf("n"); while (fscanf(f,"%d",&x)!=EOF) printf("%d ",x); fclose(f); } //doc mot so tu file f1 ghi vao file f2, //neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc //thi doan con trong file f1 da het, gan endsub=1 void CopyRecord(FILE *f1,FILE *f2, int &endsub) { int n,m; long p1,p2; endsub=0; if (fscanf(f1,"%d",&n)!=EOF) { fprintf(f2,"%d ",n); fgetpos(f1,&p1); if (fscanf(f1,"%d",&m)==EOF) endsub=1; else { if (m<n) endsub=1; fsetpos(f1,&p1); } } else endsub=1; } //chep mot doan con tu f1 vao f2 void CopySub(FILE *f1,FILE *f2) { int endsub=0; while (!endsub) CopyRecord(f1,f2,endsub); } //tach filename thanh filename1 va filename2
  • 5. void Split(char *filename, char *filename1, char *filename2) { int flag,n,n1; FILE *f,*f1,*f2; f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w"); flag=1; while (!feof(f)) { if (flag) CopySub(f,f1); else CopySub(f,f2); flag=1-flag; } fclose(f);fclose(f1);fclose(f2); } //tra ve so nguyen ma con tro f dang tro toi //neu con tro o cuoi file thi gan endsub=1 int CurRecord(FILE *f, int &endsub) { int n; long p; endsub=0; fgetpos(f,&p); if (fscanf(f,"%d",&n)==EOF) endsub=1; else fsetpos(f,&p); return n; } //tron filename1 va filename2, ghi vao filename int Merge(char *filename1, char *filename2, char *filename) { FILE *f, *f1, *f2; int numsub,endsub1,endsub2,n1,n2; f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w"); numsub=0; while (!feof(f1)||!feof(f2)) { endsub1=endsub2=0; do {
  • 6. n1=CurRecord(f1,endsub1); n2=CurRecord(f2,endsub2); if (!endsub1&&!endsub2) { if (n1<n2) CopyRecord(f1,f,endsub1); else CopyRecord(f2,f,endsub2); } }while(!endsub1 && !endsub2); if (!endsub1) CopySub(f1,f); else if (!endsub2) CopySub(f2,f); numsub++; } while (!feof(f1)) { CopySub(f1,f); numsub++; } while (!feof(f2)) { CopySub(f2,f); numsub++; } fclose(f);fclose(f1);fclose(f2); return numsub; } void MergeSort(char *filename) { char *filename1="d:temp1.txt", *filename2="d:temp2.txt"; int numsub; do { Split(filename,filename1,filename2); numsub=Merge(filename1,filename2,filename); }while(numsub>1); } void main()
  • 7. { char *filename="d:test.txt"; char *filename1="d:temp1.txt"; char *filename2="d:temp2.txt"; int n; printf("nNhap so phan tu cua day so:"); scanf("%d",&n); WriteFile(filename,n); ReadFile(filename); MergeSort(filename); ReadFile(filename); } bai 6 trang 103 vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3) se co hai nghiem la: x=(1,0,1) va x=(1,1,0) #include <stdio.h> #include <conio.h> int x[100],a[100],n,b,count,s; void init() { printf("n="); scanf("%d",&n); for (int i=0;i<n;i++) { printf("a%d=",i+1); scanf("%d",&a[i]); } printf("b="); scanf("%d",&b); count=0; s=0; } void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]); } void Try(int i) { for (int j=0; j<=1; j++)
  • 8. { if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b { x[i]=j; //xac dinh x[i] s=s+a[i]*x[i]; //cap nhat bien trang thai s if (i==n-1) { if (s==b) result(); } else Try(i+1); s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 7 trang 103 vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3) se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0) #include <stdio.h> #include <conio.h> int x[100],a[100],n,b,count,s; void init() { printf("n="); scanf("%d",&n); for (int i=0;i<n;i++) { printf("a%d=",i+1); scanf("%d",&a[i]); } printf("b="); scanf("%d",&b); count=0; s=0; }
  • 9. void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]); } void Try(int i) { for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan { if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b { x[i]=j; //xac dinh x[i] s=s+a[i]*x[i]; //cap nhat bien trang thai s if (i==n-1) { if (s==b) result(); } else Try(i+1); s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 9 trang 104 vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so 5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1 #include <stdio.h> #include <conio.h> int x[100],N,count,s,k,n; void init()
  • 10. { printf("N="); scanf("%d",&N); count=0; s=0; k=1; n=0; } void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]); } void Try(int i) { for (int j=k; j<=N; j++)//cac kha nang cua x[i] { if (s<N) { x[i]=j; //xac dinh x[i] s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n if (s==N) result(); else if (s<N) Try(i+1); s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 10 trang 104: hinh vuong than bi Y tuong: (moi ma phuong la mot hoan vi) - tim tat ca cac hoan vi cua tap {1,...,n*n} - Kiem tra hoan vi nao la ma phuong thi in hoan vi do #include <stdio.h> #include <conio.h>
  • 11. int x[100], b[100],n,count; int a[10][10]; void init() { printf("n="); scanf("%d",&n); for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung count=0; } int test() //kiem tra hoan vi co la ma phuong { int i, j, k, s, s0, s1, s2; //doi hoan vi thanh ma tran de de kiem tra t/c ma phuong i=0; j=0; for (k=0;k<n*n;k++) { a[i][j]=x[k]; j++; if (j==n) {i++; j=0;} } //kiem tra tong moi dong phai bang nhau s0=0;//gia tri dong 0 for (j=0;j<n;j++) s0=s0+a[0][j]; for (i=1;i<n;i++) { s=0;//gia tri dong i for (j=0;j<n;j++) s=s+a[i][j]; //neu dong i khac dong 0 thi khong phai ma phuong if (s!=s0) return 0; } //kiem tra cot s0=0;//gia tri cot 0 for (i=0;i<n;i++) s0=s0+a[i][0]; for (j=1;j<n;j++)
  • 12. { s=0;//gia tri cot j for (i=0;i<n;i++) s=s+a[i][j]; //neu cot j khac cot 0 thi khong phai ma phuong if (s!=s0) return 0; } //kiem tra duong cheo s1=0,s2=0; for (i=0;i<n;i++) { s1=s1+a[i][i]; s2=s2+a[i][n-1-i]; } if (s1!=s2) return 0; return 1; //hoan vi la ma phuong } void result() { if (test()) { count++; printf("nMa phuong %d:n",count); for (int i=0;i<n;i++) { for (int j=0;j<n;j++) printf("%3d",a[i][j]); printf("n"); } } } void Try(int i) { for (int j=0; j<n*n; j++) {
  • 13. if (b[j]) { x[i]=j+1; b[j]=0;//j su dung roi if (i==n*n-1) result(); else Try(i+1); b[j]=1; //tra lai trang thai cu, j chua su dung } } } void main() { clrscr(); init(); Try(0); getch(); } Giải: Bài 2: Hướng dẫn: a) Duyệt từ đầu đến cuối văn bản chương trình và sử dụng các phép biến đổi tương đương sau: + Nếu gặp lệnh while thì giữ nguyên. + Nếu gặp lệnh do..while chuyển sang while như sau: do { khoi_lenh; //gồm một hoặc nhiều lệnh }while(bieu_thuc_đieu_kien); khoi_lenh; while(bieu_thuc_đieu_kien) { khoi_lenh; } + Nếu gặp lệnh for chuyển sang while như sau: for(bieu_thuc_1;bieu_thuc_dieu_kien; bieu_thuc_2) { khoi_lenh; } bieu_thuc_1; while(bieu_thuc_dieu_kien) { khoi_lenh; bieu_thuc_2; } + Nếu gặp lệnh if chuyển sang while như sau:
  • 14. if (bieu_thuc_dieu_kien) { khoi_lenh; } while(bieu_thuc_dieu_kien ) { khoi_lenh; break; } + Nếu gặp lệnh if..else chuyển sang while như sau: if (bieu_thuc_dieu_kien) khoi_lenh_1; else khoi_lenh_2; int flag=1; while(bieu_thuc_dieu_kien ) { khoi_lenh_1; flag=0; break; } while(flag) { khoi_lenh_2; break; } + Nếu gặp lệnh switch() chuyển sang lệnh if else, sau đó từ if else chuyển sang while: switch(bieu_thuc) { case gia_tri_1: khoi_lenh_1; break; case gia_tri_2: khoi_lenh_2; break; [. . . ] case gia_tri_n: khoi_lenh_n; break; [default: khoi_lenh_n+1; ] } if (bieu_thuc==gia_tri_1) khoi_lenh_1; else if (bieu_thuc==gia_tri_2) khoi_lenh_2; else […] if (bieu_thuc==gia_tri_n) khoi_lenh_n; [else khoi_lenh_n+1;] Bài 3: Hướng dẫn Cách 1: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su int B;//suc chua cai tui int A[MAX];//mang chua trong luong cua cac vat: a1,...,an
  • 15. int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep char *filename="d:data.in"; void DocFile() { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); } void KhoiTao() { FOPT = -32000; //gan gia tri toi uu ban dau //gan phuong an hien tai ban dau: x1=x2=...=xn=0 //va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0 for(int i=1; i<=n; i++) {
  • 16. X[i]=0; XOPT[i]=0; } } void DayNhiPhanKe()//tim day nhi phan ke tiep { int i=n; while(i>0 && X[i]==1) {X[i]=0;i--;} if( i==0) stop=1; else X[i]=1; } void CapNhatPATU()//cap nhat phuong an toi uu { //X1,...,Xn la day nhi phan ung voi phuong an hien tai //S la tong trong luong cac vat ung voi phuong an hien tai //P la tong gia tri cac vat ung voi phuong an hien tai int S=0, P=0; for( int i=1; i<=n ; i++)//tinh S va P { S = S + A[i] * X[i]; P = P + C[i] * X[i]; } //Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui //va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat if ( S<=B && FOPT < P) { FOPT = P; // Cap nhat gia tri toi uu moi for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi XOPT[i] = X[i]; } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:");
  • 17. for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); KhoiTao(); while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an { CapNhatPATU(); DayNhiPhanKe(); } GhiFile(); } Cách 2: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su int B;//suc chua cai tui int A[MAX];//mang chua trong luong cua cac vat: a1,...,an int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu char *filename="d:data.in"; void DocFile() { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B
  • 18. printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); FOPT = -32000; //gan gia tri toi uu ban dau } void CapNhatPATU()//cap nhat phuong an toi uu { //X1,...,Xn la day nhi phan ung voi phuong an hien tai //S la tong trong luong cac vat ung voi phuong an hien tai //P la tong gia tri cac vat ung voi phuong an hien tai int S=0, P=0; for( int i=1; i<=n ; i++)//tinh S va P { S = S + A[i] * X[i]; P = P + C[i] * X[i]; } //Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui //va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat if ( S<=B && FOPT < P) { FOPT = P; // Cap nhat gia tri toi uu moi for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi XOPT[i] = X[i]; } } void Try(int i)//lan luot xet tat ca cac phuong an
  • 19. { for(int j=0;j<=1;j++) { X[i]=j; if(i==n) CapNhatPATU(); else Try(i+1); } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:"); for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); Try(1); GhiFile(); } * Cach 3: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su int B;//suc chua cai tui int A[MAX];//mang chua trong luong cua cac vat: a1,...,an int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn
  • 20. //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu char *filename="d:data.in"; int S=0,P=0; void DocFile() { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); FOPT = -32000; //gan gia tri toi uu ban dau } void Try(int i)//lan luot xet tat ca cac phuong an { for(int j=0;j<=1;j++) { X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i]; if(i==n) { if ( S<=B && FOPT < P)
  • 21. { FOPT = P; //Cap nhat gia tri toi uu moi for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi XOPT[k] = X[k]; } } else if(S<B) Try(i+1); S=S-A[i]*X[i];P=P-C[i]*X[i]; } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:"); for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); Try(1); GhiFile(); } Bai 24: HD: #include <conio.h> #include <string.h> char *data1="d:data1.out"; char *data2="d:data2.out"; int num1=0,num2=0; void Sdt(int flag)//flag=0 la dem, flag=1 la ghi
  • 22. { FILE *f1=fopen(data1,"w"); FILE *f2=fopen(data2,"w"); if(flag==1) {fprintf(f1,"%d",num1);fprintf(f2,"%d",num2);} for(int n=1;n<=4;n++) for(int x1=0;x1<=9;x1++) for(int x2=0;x2<=9;x2++) for(int x3=0;x3<=9;x3++) { if(flag==0) num1++; else fprintf(f1,"n091%d.%d%d%d.%d%d %d",n,x1,x2,x3,x3,x2,x1); if(x1+x2+x3==4) { if (flag==0) num2++; else fprintf(f2,"n091%d.%d%d%d.%d%d %d",n,x1,x2,x3,x3,x2,x1); } } fclose(f1);fclose(f2); } void main() { Sdt(0);//dem cac so dien thoai Sdt(1);//ghi cac so dien thoai vao file } Bài 25: Chú ý: làm bài tập tương tự với đồ thị có hướng HD: #include <stdio.h> const max=30;//so dinh toi da int n;//so dinh thuc su int mtk[max][max];//mang chua ma tran ke int stplt=0;//bien dem so thanh phan lien thong
  • 23. //mang danh dau dinh da tham roi hay chua //tham[i]=0 la i chua tham //tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k int tham[max]; char *dothi="d:dothi.in"; char *ketqua="d:ketqua.out"; void DocFile() { int i,j; FILE *f=fopen(dothi,"r");//mo file dothi de doc fscanf(f,"%d",&n);//doc so dinh cua do thi //ban dau gan mtk=0 for(i=1;i<=n;i++) for(j=1;j<=n;j++) mtk[i][j]=0; //lan luot doc cac canh (i,j) trong file while(fscanf(f,"%d%d",&i,&j)!=EOF) mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk fclose(f);//dong file } void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i { tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt for(int j=1;j<=n;j++) if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i DFS1(j);//tham j } void DFS() { //ban dau gan tat ca cac dinh la chua tham for(int i=1;i<=n;i++) tham[i]=0; for(i=1;i<=n;i++)//lan luot xet cac dinh i if(tham[i]==0)//neu dinh i chua tham { stplt++;//tang so tplt DFS1(i);//tham mot tplt chua i } } void GhiFile()
  • 24. { FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi if(stplt==1) fprintf(f,"Do thi lien thong"); else { fprintf(f,"Do thi khong lien thong"); for(int i=1;i<=stplt;i++) { fprintf(f,"nThanh phan lien thong thu %d:",i); for(int j=1;j<=n;j++) if(tham[j]==i)//neu j thuoc tplt thu i fprintf(f,"%4d",j);//ghi j vao tplt thu i } } fclose(f); } void main() { DocFile(); DFS(); GhiFile(); } Bài 26 * Bài 1: + Câu a: #include <iostream.h> #include <stdlib.h> const max=30; void input(int a[], int &n) { cout<<"nNhap so phan tu:"; cin>>n; randomize(); for(int i=1;i<=n;i++) a[i]=random(20); } void output(int a[], int n) { for(int i=1;i<=n;i++) cout<<a[i]<<",";
  • 25. } //dieu chinh day a[i],a[i+1],...,a[n] thanh heap, biet rang a[i+1],..,a[n] da la heap void adjust(int a[], int i, int n) { int x=a[i]; //cat a[i] vao bien x (bien tam) int j=2*i; //a[j] la con cua a[i] while(j<=n) { //neu a[i] co hai con thi chon a[j] la con lon nhat if (j<n && a[j+1]>a[j]) j=j+1; if (a[j]>x) //neu con cua a[i] la a[j] lon hon x { a[i]=a[j];//doi a[j] len vt a[i] i=j;//lai xet pt a[i] moi j=2*i;//a[j] la con cua a[i] } else break;//neu a[j]<=x thi ngung } a[i]=x; } void heapsort(int a[], int n) { /* lan luot dieu chinh cac day a[n/2],…,a[n]; a[n/2 + 1],…,a[n]; a[1],…,a[n] thanh heap */ for(int i=n/2;i>=1;i--) { adjust(a,i,n); cout<<"ni="<<i<<": ";output(a,n); } //lan luot dua pt lon nhat xuong vt a[n],…,a[2] bang cach hoan vi voi a[1] //sau do giam n va lai dieu chinh a[1] den a[n] thanh heap for(int j=n;j>=2;j--) { int x=a[1]; a[1]=a[j]; a[j]=x; //hoan vi a[j] voi a[1] adjust(a,1,j-1);//dieu chinh day a[1],…,a[j-1] thanh heap cout<<"nj="<<j<<": ";output(a,n); }
  • 26. } void main() { int a[max],n; input(a,n); cout<<"nDay truoc khi sx:"; output(a,n); heapsort(a,n); cout<<"nDay sau khi sx:"; output(a,n); } + Câu b: #include <iostream.h> #include <stdlib.h> #include <conio.h> const max=50; void input(int a[], int &n) { cout<<endl<<"Nhap so phan tu:"; cin>>n; randomize(); for(int i=1;i<=n;i++) a[i]=random(max); } void output(int a[], int n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; } int sub_max(int a[], int n, int j) { int k=0; if(j<=n) { k=j; if (j+1<=n&&a[j+1]>a[k]) k=j+1; if (j+2<=n&&a[j+2]>a[k]) k=j+2; } return k; } void Adjust(int a[], int i, int n) { int x=a[i]; while(1) { int k=sub_max(a,n,3*i-1); if(k==0||a[k]<x) break;
  • 27. a[i]=a[k]; i=k; } a[i]=x; } void HeapSort(int a[], int n) { for(int i=(n+1)/3; i>=1; i--) Adjust(a,i,n); for(int j=n;j>=2;j--) { int x=a[1]; a[1]=a[j]; a[j]=x; Adjust(a,1,j-1); } } void main() { int a[max],n; input(a,n); cout<<endl<<"Day truoc khi sap:"<<endl; output(a, n); HeapSort(a,n); cout<<endl<<"Day sau khi sap:"<<endl; output(a, n); } Bài 27: * Bài 2: include <iostream.h> #include <stdlib.h> //#include <conio.h> const max=50; struct datatype { int l,r; }; struct node { datatype data; node * next; }; typedef node* nodeptr; void push(nodeptr &s, datatype x) { nodeptr p=new node;
  • 28. p->data=x;p->next=s;s=p; } datatype pop(nodeptr &s) { if(s==NULL) {cout<<"nStack is empty!"; exit(1);} nodeptr p=s; datatype x=p->data; s=s->next; delete p;return x; } void input(int a[], int &n) { cout<<endl<<"Nhap so phan tu:"; cin>>n; randomize(); for(int i=1;i<=n;i++) a[i]=random(max); } void output(int a[], int n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; } void quick_sort(int a[], int l, int r) { nodeptr s=NULL; datatype x,y; x.l=l; x.r=r; push(s,x); while(s!=NULL) { datatype x=pop(s); int t=a[(x.l+x.r)/2],i=x.l,j=x.r; do { while(a[i]<t) i++; while(a[j]>t) j--; if(i<=j) { int temp=a[i];a[i]=a[j]; a[j]=temp; i++; j--; } }while(i<=j); if (x.l<j){y.l=x.l;y.r=j;push(s,y);} if (i<x.r){y.l=i;y.r=x.r; push(s,y);} } } void main()
  • 29. { int a[max],n,m;char ans; do { input(a,n); cout<<endl<<"Day so truoc khi sap:"<<endl; output(a, n);quick_sort(a,1,n); cout<<endl<<"Day so sau khi sap:"<<endl; output(a, n); cout<<"nTiep khong (c/k)?:"; cin>>ans; }while(ans=='c'||ans=='C'); } Bài 28 * Bài 3: //tron tu nhien ba bang hai giai doan tren file #include <stdio.h> #include <stdlib.h> //tao file chua n so nguyen ngau nhien tu 0 den 19 void WriteFile(char *filename, int n) { FILE *f; int i; f=fopen(filename,"w"); randomize(); for (i=1;i<=n;i++) fprintf(f,"%d ",random(20)); fclose(f); } //doc file chua cac so nguyen hien ra man hinh void ReadFile(char *filename) { FILE *f; int x; f=fopen(filename,"r"); printf("n"); while (fscanf(f,"%d",&x)!=EOF) printf("%d ",x); fclose(f); } //doc mot so tu file f1 ghi vao file f2,
  • 30. //neu f1 da o cuoi file hoac so tiep theo nho hon so moi doc //thi doan con trong file f1 da het, gan endsub=1 void CopyRecord(FILE *f1,FILE *f2, int &endsub) { int n,m; long p1,p2; endsub=0; if (fscanf(f1,"%d",&n)!=EOF) { fprintf(f2,"%d ",n); fgetpos(f1,&p1); if (fscanf(f1,"%d",&m)==EOF) endsub=1; else { if (m<n) endsub=1; fsetpos(f1,&p1); } } else endsub=1; } //chep mot doan con tu f1 vao f2 void CopySub(FILE *f1,FILE *f2) { int endsub=0; while (!endsub) CopyRecord(f1,f2,endsub); } //tach filename thanh filename1 va filename2 void Split(char *filename, char *filename1, char *filename2) { int flag,n,n1; FILE *f,*f1,*f2; f=fopen(filename,"r");f1=fopen(filename1,"w");f2=fopen(filename2,"w"); flag=1; while (!feof(f)) { if (flag) CopySub(f,f1); else CopySub(f,f2);
  • 31. flag=1-flag; } fclose(f);fclose(f1);fclose(f2); } //tra ve so nguyen ma con tro f dang tro toi //neu con tro o cuoi file thi gan endsub=1 int CurRecord(FILE *f, int &endsub) { int n; long p; endsub=0; fgetpos(f,&p); if (fscanf(f,"%d",&n)==EOF) endsub=1; else fsetpos(f,&p); return n; } //tron filename1 va filename2, ghi vao filename int Merge(char *filename1, char *filename2, char *filename) { FILE *f, *f1, *f2; int numsub,endsub1,endsub2,n1,n2; f1=fopen(filename1,"r");f2=fopen(filename2,"r");f=fopen(filename,"w"); numsub=0; while (!feof(f1)||!feof(f2)) { endsub1=endsub2=0; do { n1=CurRecord(f1,endsub1); n2=CurRecord(f2,endsub2); if (!endsub1&&!endsub2) { if (n1<n2) CopyRecord(f1,f,endsub1); else CopyRecord(f2,f,endsub2); } }while(!endsub1 && !endsub2); if (!endsub1) CopySub(f1,f);
  • 32. else if (!endsub2) CopySub(f2,f); numsub++; } while (!feof(f1)) { CopySub(f1,f); numsub++; } while (!feof(f2)) { CopySub(f2,f); numsub++; } fclose(f);fclose(f1);fclose(f2); return numsub; } void MergeSort(char *filename) { char *filename1="d:temp1.txt", *filename2="d:temp2.txt"; int numsub; do { Split(filename,filename1,filename2); numsub=Merge(filename1,filename2,filename); }while(numsub>1); } void main() { char *filename="d:test.txt"; char *filename1="d:temp1.txt"; char *filename2="d:temp2.txt"; int n; printf("nNhap so phan tu cua day so:"); scanf("%d",&n); WriteFile(filename,n); ReadFile(filename);
  • 33. MergeSort(filename); ReadFile(filename); } Bài 29: * Bài 4 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> struct sinhvien { char masv[10]; int diemthi; }; int Eof(FILE *f) { fpos_t fpos; sinhvien sv; int num;//so sv doc duoc phai la 1, neu la 0 thi het file fpos=ftell(f); num=fread(&sv,sizeof(sv),1,f); fseek(f,fpos,0); return (num==0)?1:0; } void RandomFileSV(char *filename, int n) { FILE *f=fopen(filename,"wb"); sinhvien sv; char index[5]; randomize(); for(int i=1;i<=n;i++) { itoa(i,index,10); strcpy(sv.masv,"DH08"); if (i<10) strcat(sv.masv,"0"); strcat(sv.masv,index); sv.diemthi= random(11); fwrite(&sv,sizeof(sv),1,f);
  • 34. } fclose(f); } void PrintFileSV(char *filename) { FILE *f=fopen(filename,"rb"); sinhvien sv; //neu het file fread tra ve 0 while(!Eof(f)) { fread(&sv,sizeof(sv),1,f); printf("n%-10s%4d",sv.masv,sv.diemthi); } fclose(f); } int CurrentRecord(FILE* f) { fpos_t fpos; sinhvien sv; fpos=ftell(f); fread(&sv,sizeof(sv),1,f); fseek(f,fpos,0); return sv.diemthi;//tra ve diem thi cua sv hien hanh } int CopyRecord(FILE* f1, FILE* f2) { int n; sinhvien sv; if (!Eof(f1)) { fread(&sv,sizeof(sv),1,f1); fwrite(&sv,sizeof(sv),1,f2); } if (Eof(f1)) return 1; else return (CurrentRecord(f1)<sv.diemthi)?1:0; //1 la kt doan con hoac het file } void CopySubFile(FILE *f1, FILE *f2)
  • 35. { while(!CopyRecord(f1,f2)); } void SplitFile(char *filename,char *filename1, char *filename2) { FILE *f,*f1,*f2; int filenum; f=fopen(filename,"rb");f1=fopen(filename1,"wb"); f2=fopen(filename2,"wb"); filenum=1; while(!Eof(f)) { if (filenum==1) CopySubFile(f,f1); else CopySubFile(f,f2); filenum=3-filenum; } fclose(f);fclose(f1);fclose(f2); } int MergeFile(char *filename1,char *filename2,char *filename) { FILE *f,*f1,*f2; int numsubfile,endsubfile1,endsubfile2; numsubfile=0; f1=fopen(filename1,"rb");f2=fopen(filename2,"rb"); f=fopen(filename,"wb"); while(!Eof(f1)&&!Eof(f2)) { endsubfile1=endsubfile2=0; do { if (CurrentRecord(f1)<CurrentRecord(f2)) endsubfile1=CopyRecord(f1,f); else endsubfile2=CopyRecord(f2,f); }while(!endsubfile1&&!endsubfile2); if (!endsubfile1) CopySubFile(f1,f); else
  • 36. if (!endsubfile2) CopySubFile(f2,f); numsubfile++; } while(!Eof(f1)) { CopySubFile(f1,f); numsubfile++; } while(!Eof(f2)) { CopySubFile(f2,f); numsubfile++; } fclose(f);fclose(f1);fclose(f2); return numsubfile; } void MergeSort(char *file) { char *file1="d:test1.dat"; char *file2="d:test2.dat"; int numsubfile=0; do { SplitFile(file,file1,file2); numsubfile=MergeFile(file1,file2,file); }while(numsubfile>1); remove(file1);remove(file2); } void main() { char *filename="d:test.dat"; clrscr(); RandomFileSV(filename,10); printf("nFile sv truoc khi sap xep:"); PrintFileSV(filename);
  • 37. MergeSort(filename); printf("nFile sv sau khi sap xep:"); PrintFileSV(filename); getch(); } BÀI TẬP 77: Cài đặt thuật toán Ford-Fulkerson #include <stdio.h> #include <conio.h> #include <stdlib.h> const max=20; int dsc[max][4],c[max][max],f[max][max]; int p[max],d[max],tham[max],m,n,s,t; char *tenfile="d:/fordfulk.txt"; //doc d/s cung tu file, m la so cung, n la so dinh void Doc_File_DSC() { FILE *f=fopen(tenfile,"r"); if (f==NULL) { printf("nFile %s khong co",tenfile); exit(0); } fscanf(f,"%d%d%d%d",&n,&m,&s,&t); for (int i=1; i<=m; i++) { fscanf(f,"%d%d%d%d",&(dsc[i][0]),&(dsc[i][1]),&(dsc[i][2]),&(dsc[i][3])); } fclose(f); } const vc=100; //vo cuc //Chuyen danh sach cung sang ma tran ke co huong void Chuyen_DSC_MTK() { int i,j,k; for (i=1; i<=n; i++) for (j=1; j<=n; j++) { c[i][j]=f[i][j]=0;}
  • 38. for (k=1; k<=m; k++) { i=dsc[k][0],j=dsc[k][1]; c[i][j]=dsc[k][2];f[i][j]=dsc[k][3]; } } //tim duong tang luong int Find_Path() { int u,v,queue[max],dau,cuoi; for (v=1;v<=n;v++) tham[v]=0; queue[1]=s;p[s]=s;d[s]=vc;tham[s]=1; dau=1; cuoi=2; while (dau!=cuoi) { u=queue[dau++]; for (v=1;v<=n;v++) { if (!tham[v]) { if (c[u][v]>0 && f[u][v]<c[u][v]) // Gf co cung thuan (u,v) { p[v]=u; d[v]=(d[u]<c[u][v]-f[u][v])?d[u]:(c[u][v]-f[u] [v]); if (v == t) return 1; queue[cuoi++]=v; tham[v]=1; } if (c[v][u]>0 && f[v][u]>0) //co cung nghich (u,v) { p[v]=-u; d[v]=(d[u]<f[v][u])?d[u]:f[v][u]; if (v == t) return 1; queue[cuoi++]=v; tham[v]=1; } } } } return 0;
  • 39. } //tang luong void Inc_Flow() { int u,v,tang; v=p[t]; u=t; tang=d[t]; while (u!=s) { if (v>0) f[v][u]=f[v][u]+tang; else { v=-v; f[u][v]=f[u][v]-tang; } u=v; v= p[u]; } } void Max_Flow() { int u,v,stop,sum; stop=0; while (!stop) if (Find_Path()) Inc_Flow(); else stop=1; printf("Luong cuc dai:"); for (u=1;u<=n;u++) { printf("n"); for (v=1;v<=n;v++) { printf("%d ",f[u][v]); } } sum=0; for (u=1;u<=n;u++) if (c[s][u]>0) sum+=f[s][u]; printf("nnGia tri luong cuc dai:%d",sum); printf("nnLat cat:");
  • 40. printf("nVT:"); for (u=1;u<=n;u++) if (tham[u]) printf("%d ",u); printf("nVVT:"); for (u=1;u<=n;u++) if (!tham[u]) printf("%d ",u); } void main() { clrscr(); Doc_File_DSC(); Chuyen_DSC_MTK(); Max_Flow(); getch(); } Bài 30 HD: //tim cay khung nho nhat tren do thi lien thong #include <stdio.h> #include <conio.h> const max=30;//so dinh toi da const vc=1000;//gia tri vo cuc int n;//so dinh thuc su int s;//dinh xuat phat int mtk[max][max];//mang chua ma tran ke int tham[max];//tham[i]=0 la i chua tham,tham[i]=1 la i tham roi int d[max];//d[i] kcnn tu i den cay khung int gan[max];//gan[i]=j nghia la j la dinh cua cay khung gan i nhat int canhck[max][3];//mang luu canh cay khung int m=0;//so canh cay khung int cd=0;//chieu dai cay khung char *dulieu="d:caykhung.in"; char *ketqua="d:caykhung.out"; void DocFile()
  • 41. { int i,j,k; FILE *f=fopen(dulieu,"r");//mo file du lieu de doc fscanf(f,"%d%d",&n,&s);//doc so dinh n va dinh xuat phat s //gan tri ban dau cho mtk for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) mtk[i][j]=0; else mtk[i][j]=vc; //lan luot doc tu file cac canh(i,j) co trong so k while(fscanf(f,"%d%d%d",&i,&j,&k)!=EOF) mtk[i][j]=mtk[j][i]=k;//gan k vao vi tri tuong ung trong mtk fclose(f);//dong file } void Prim()//tim cay khung nn voi s la dinh xuat phat { int i,j,u,v,min; for(i=1;i<=n;i++) { d[i]=mtk[s][i];gan[i]=s;tham[i]=0; } tham[s]=1;//danh dau s tham roi for(i=1;i<=n-1;i++)//lan luot tham n-1 dinh con lai { //tim dinh u chua tham va co d[u] nho nhat de tham min=vc; for(j=1;j<=n;j++) if(tham[j]==0&&d[j]<min)//neu j chua tham va d[j]<min { u=j; min=d[j]; } tham[u]=1;++m; canhck[m][1]=u;canhck[m][2]=gan[u];canhck[m][3]=mtk[u][gan[u]]; cd=cd+canhck[m][3]; //cap nhat cac dinh v chua tham va v ke u for(v=1;v<=n;v++) if(tham[v]==0&&mtk[u][v]!=vc) if(d[v]>mtk[u][v]) {
  • 42. d[v]=mtk[u][v];gan[v]=u; } } } void GhiFile() { FILE *f=fopen(ketqua,"w"); int i,j,k; fprintf(f,"%dt%d",m,cd); for(i=1;i<=m;i++) fprintf(f,"n%dt%dt%d",canhck[i][1],canhck[i][2],canhck[i][3]); fclose(f); } void main() { DocFile(); Prim(); GhiFile(); } Bài 31 Bài giải 31: HD: #include <stdio.h> #include <math.h> #include <conio.h> const max=30; int a=3,b=6; int X[max];//chua so can tim: x1x2...xn (a<=n<=b) int S,P,B; int count=0; long K=0; void tinhK(int i)//tinh K co i chu so X1X2...Xi { long q=1;K=0; for(int j=i;j>0;j--) { K=K+q*X[j];q=q*10;
  • 43. } } int ktnt()//kiem tra K co la nguyen to kg? { int nt=1; for(long i=2;i<=sqrt(K);i++) if(K%i==0) {nt=0;break;} return nt; } //kiem tra xem K=x1...xi co tong x1+...+xi co chia het cho S hay kg? int kttong(int i) { long M=0;//M la tong cac chu so cua K for(int j=1;j<=i;j++) M=M+X[j]; if (M%S==0) return 1; else return 0; } //kiem tra K bieu dien o co so B co la so thuan nghich hay kg? int kttn() { int d[max];//dm...d1 la bieu dien o co so B cua K long T=K; int m=0; do { d[++m]=T%B;T=T/B; }while(T!=0); int tn=1; for(int i=1;i<=m/2;i++) if(d[i]!=d[m-i+1]) {tn=0;break;} return tn; } void Try(int i) { for(int j=0;j<=9;j++) { if((i!=1&&j!=P)||(i==1&&j!=0&&j!=P)) { X[i]=j; if(i>=a&&i<=b) { tinhK(i); if(ktnt()==1&&kttong(i)==1&&kttn()==1) {
  • 44. printf("n%d)%ld",++count,K); if(count%20==0) getch(); } } if(i<b) Try(i+1); } } } void main() { printf("n1.K co %d den %d chu so",a,b); printf("n2.K la so nguyen to"); printf("n3.Cac chu so cua K phai khac P"); printf("n4.Tong cac chu so cua K phai chia het cho S"); printf("n5.Bieu dien theo co so B cua K phai la day thuan nghich"); printf("nNhap P(0->9):");scanf("%d",&P); printf("Nhap S:");scanf("%d",&S); printf("Nhap co so B:");scanf("%d",&B); Try(1); } BÀI TẬP 82: Bài toán mã đi tuần Mã nguồn: #include<iostream> using namespace std; int bc[100][100]; int lechX[8] = {2,1,-1,-2,-2,-1,1,2}; int lechY[8] = {1,2,2,1,-1,-2,-2,-1}; int n; void init(){ for(int i = 0; i<n; i++) for(int j = 0; j<n; j++) bc[i][j] = 0; }
  • 45. void print(){ cout<<"Thu tu cac buoc di cua quan ma: n"; for(int i=0; i<n; i++){ for(int j=0; j<n; j++) cout<<bc[i][j]<<" "; cout<<endl; } } void knightTour(int j,int x, int y){ int u,v; for(int i = 0 ;i<8; i++){ u = x + lechX[i]; v = y + lechY[i]; if(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 ){ bc[u][v] = j; if (j==n*n) print(); else knightTour(j+1,u,v); bc[u][v] = 0; } } } void main(){ cout<<"Nhap n= "; cin>>n; init(); int x0= 4, y0=4; bc[x0][y0]=1; knightTour(2,x0,y0); cout<<endl;
  • 46. system("PAUSE"); } Các pác có biết input như thế nào có thể cho ra output hông? Hông biết code của mình có vấn đề hay không mà chạy hoài không có output nào cả. Mình thấy bạn nhầm ở điều kiện if(0<=u && u<n && 0<=v && v<n && bc[x][y]==0 ) Ở đây bc[x][y] nên được sửa thành bc[u][v]. Thêm nữa, có lẽ bạn chọn vị trí không tốt nên chạy không ra kết quả. Mình sửa hàm KnightTour thành: Mã nguồn: void KnightTour(int j, int x, int y) { int u,v; if (j > n*n) { print(); } else { for (int i = 0 ;i < 8; i++) { u = x + lechX[i]; v = y + lechY[i]; if (0 <= u && u < n && 0 <= v && v < n && bc[u][v] == 0) { bc[u][v] = j; knightTour(j+1, u, v); bc[u][v] = 0; } } } } và đặt x0 = 0, y0 = 0 thì chạy cho ra vô số kết quả với n = 8. -------------------------------------------------------------------------------------------------------------- Công thức truy hồi Xem các dãy số {xn}, {yn}, {zn} được cho theo công thức như sau: x0=y0=z0=1 với n>=1 thì:
  • 47. xn=xn-1 + 2yn-1 + 3zn-1 yn=4xn-1 + 5yn-1 + 6zn-1 zn=7xn-1 + 8yn-1 + 9zn-1 Hãy viết hàm (không đệ quy) để tính giá trị của xn, yn, zn khi biết n (nguyên không âm). Hàm này mô tả như sau: void EvaluateXYZ(int n, float& x, float& y, float& z); Trong đó, các tham biến x, y, z nhận về các giá trị tương ứng của xn, yn, zn. Bài này đơn giản là dùng 3 biến để lưu giá trị trước như sau: Mã nguồn: void EvaluateXYZ(int n, float &x, float &y, float &z) { float x0 = x = 1, y0 = y = 1, z0 = z = 1; for (int i=1; i<=n; i++) { x = x0 + 2*y0 + 3*z0; y = 4*x0 + 5*y0 + 6*z0; z = 7*x0 + 8*y0 + 9*z0; x0 = x; y0 = y; z0 = z; } } Bài 35 HD: #include <stdio.h> const max=30;//so dinh toi da int n;//so dinh thuc su int mtk[max][max];//mang chua ma tran ke int stplt=0;//bien dem so thanh phan lien thong //mang danh dau dinh da tham roi hay chua //tham[i]=0 la i chua tham //tham[i]=k la i tham roi, va i thuoc thanh phan lien thong thu k int tham[max]; char *dothi="d:dothi.in"; char *ketqua="d:ketqua.out"; void DocFile() { int i,j;
  • 48. FILE *f=fopen(dothi,"r");//mo file dothi de doc fscanf(f,"%d",&n);//doc so dinh cua do thi //ban dau gan mtk=0 for(i=1;i<=n;i++) for(j=1;j<=n;j++) mtk[i][j]=0; //lan luot doc cac canh (i,j) trong file while(fscanf(f,"%d%d",&i,&j)!=EOF) mtk[i][j]=mtk[j][i]=1; //gan 1 vao vi tri tuong ung trong mtk fclose(f);//dong file } void DFS1(int i)//duyet mot thanh phan lien thong chua dinh i { tham[i]=stplt;//danh dau i tham roi va i thuoc tplt thu stplt for(int j=1;j<=n;j++) if(tham[j]==0&&mtk[i][j]==1)//neu j chua tham va j ke i DFS1(j);//tham j } void DFS() { //ban dau gan tat ca cac dinh la chua tham for(int i=1;i<=n;i++) tham[i]=0; for(i=1;i<=n;i++)//lan luot xet cac dinh i if(tham[i]==0)//neu dinh i chua tham { stplt++;//tang so tplt DFS1(i);//tham mot tplt chua i } } void GhiFile() { FILE *f=fopen(ketqua,"w");//mo file ket qua de ghi if(stplt==1) fprintf(f,"Do thi lien thong"); else { fprintf(f,"Do thi khong lien thong"); for(int i=1;i<=stplt;i++) {
  • 49. fprintf(f,"nThanh phan lien thong thu %d:",i); for(int j=1;j<=n;j++) if(tham[j]==i)//neu j thuoc tplt thu i fprintf(f,"%4d",j);//ghi j vao tplt thu i } } fclose(f); } void main() { DocFile(); DFS(); GhiFile(); } BÀI TẬP 84: Bài toán cái túi #include <stdio.h> #include <conio.h> //c[i]: gia tri su dung cua vat loai i, a[i]: trong luong vat loai i float c[100],a[100]; //x: chua phuong an trung gian, xopt: phuong an toi uu int x[100],xopt[100]; //d: so thu tu cua loai i la d[i] int d[100],n;//n la so loai vat /*w la trong luong toi da tui co the chua, weight: trong luong hien tai cua tui fopt: gia tri hien tai lon nhat cua tui cost: gia tri hien tai */ float w,weight,fopt,cost; /* file caitui.dat co dang sau: 4 8 //n=4, b=8 5 3 2 4 //a: trong luong moi loai vat 10 5 3 6 //c: gia tri moi loai vat */ void ReadFile()
  • 50. { FILE *fin; int i; if ((fin = fopen("caitui.dat", "rt"))== NULL) { printf("Khong tim thay file caitui.dat.n"); return ; } fscanf(fin,"%d%f",&n,&w); for (i=0;i<n;i++) fscanf(fin,"%f",&a[i]); for (i=0;i<n;i++) fscanf(fin,"%f",&c[i]); fclose(fin); printf("nSo loai vat:%d",n); printf("nTrong luong cai tui:%0.0f",w); printf("nTrong luong cac loai vat:"); for (i=0;i<n;i++) printf("%0.0f ",a[i]); printf("nGia tri cac loai vat:"); for (i=0;i<n;i++) printf("%0.0f ",c[i]); } void Init() { int i,j,k,t; fopt=0;// gia tri lon nhat =0 weight=0;//trong luong ban dau cua tui=0; for (i=0; i<n; i++) d[i]=i+1; for (i=0; i<n-1; i++) { k=i; for (j=i+1; j<n; j++) if (c[j]/a[j]>c[k]/a[k]) k=j; if (k!=i) { t=a[i];a[i]=a[k];a[k]=t; t=c[i];c[i]=c[k];c[k]=t; t=d[i];d[i]=d[k];d[k]=t; } }
  • 51. } void KyLuc() { if (cost>fopt) { for (int i=0; i<n; i++) { xopt[i]=x[i]; fopt=cost; } } } void Try(int i) { int j,t; t=(w-weight)/a[i];//w: suc chua cua tui for (j=t; j>=0; j--) { x[i]=j; weight=weight+a[i]*x[i];//weight:trong luong tui cost=cost+c[i]*x[i];//cost: gia tri tui if (i==n-1) KyLuc(); else if (cost+c[i+1]*(w-weight)/a[i+1]>fopt) Try(i+1); weight=weight-a[i]*x[i]; cost=cost-c[i]*x[i]; } } void InKq() { printf("nTong gia tri do vat:%0.0f",fopt); for (int i=0; i<n; i++) printf("nso luong do vat loai %d la %d",d[i],xopt[i]); } void main() { clrscr(); ReadFile();
  • 52. Init(); Try(0); InKq(); getch(); } BÀI TẬP 85: Bài toán người du lịch #include <stdio.h> #include <conio.h> #include <values.h> int n;//so thanh pho int c[100][100];//ma tran chi phi int cmin;//chi phi nho nhat trong ma tran chi phi int tp[100];//tp[i]=0:tp i da di qua, =1 chua di qua int cost;//chi phi bo phan int fopt; //gia tri ky luc, gia tri cuoi cung la gia tri toi uu int x[100];//la mot phuong an int xopt[100];//la phuong an toi uu void ReadFile() { FILE *fin; int i,j; if ((fin = fopen("dulich.dat", "rt"))== NULL) { printf("Khong tim thay file dulich.dat.n"); return ; } //doc so thanh pho fscanf(fin,"%d",&n); //doc ma tran chi phi for (i=0;i<n;i++) for (j=0;j<n;j++) fscanf(fin,"%d",&c[i][j]); fclose(fin); //xuat thong tin de kiem tra printf("nSo thanh pho:%d",n);
  • 53. printf("nMa tran chi phi:"); for (i=0;i<n;i++) { printf("n"); for (j=0;j<n;j++) printf("%3d",c[i][j]); } } void Init() { int i,j; cmin=MAXINT;//so kieu int lon nhat for (i=0;i<n;i++) { tp[i]=1;//tat ca tp i deu chua di qua for (j=0;j<n;j++)//tim cmin if ( (i!=j)&&(c[i][j]<cmin)) cmin=c[i][j]; } fopt=MAXINT;//ky luc ban dau cost=0;//chi phi bo phan x[0]=0;//tp bat dau di la tp 0 } void CNKL() //cap nhat ky luc { int i,s; s=cost+c[x[n-1]][x[0]];//cong them chi phi tro ve tp dau if (s<fopt)//neu chi phi cua hanh trinh nay < ky luc { fopt=s;//ghi nhan ky luc moi for (i=0;i<n;i++) xopt[i]=x[i]; //ghi nhan hanh trinh moi } } void Try(int i) { int j; for (j=1;j<n;j++) if (tp[j]) {
  • 54. x[i]=j; tp[j]=0;//tp j da duoc chon cost=cost+c[x[i-1]][x[i]];//chi phi bo phan if (i==n-1) CNKL(); else if (cost+(n-i+1)*cmin<=fopt) Try(i+1); tp[j]=1; cost=cost-c[x[i-1]][x[i]]; } } void Result() { int i; printf("nnChi phi nho nhat:%d",fopt); printf("nHanh trinh co chi phi nho nhat:n"); for (i=0;i<n;i++) printf ("%d -> ",xopt[i]+1); printf ("%d",xopt[0]+1); } void main() { clrscr(); ReadFile(); Init(); Try(1); Result(); getch(); } /* vi du ve file dulich.dat 6 0 3 93 13 33 9 4 0 77 42 21 16 45 17 0 36 16 28 39 90 80 0 56 7 28 46 88 33 0 25 3 88 18 46 92 0
  • 55. Co ds la: Chi phi nho nhat:104 Hanh trinh co chi phi nho nhat: 1->4->6->3->2->5->1 BÀI TOÁN 86: Chuyển từ ma trận kề sang danh sách kề #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #define MAX 10 char *dske="d:dske.out"; char *mtke="d:mtke.in"; char *dscanh="d:dscanh.out"; void chuyen_mtke() { int i,j,mtk[MAX][MAX],n,m=0; FILE *fp; fp = fopen(mtke,"r"); fscanf(fp,"%d",&n); //doc so dinh cua do thi printf("n So dinh do thi:%d",n); for(i=1; i<=n; i++) for(j=1; j<=n;j++) { fscanf(fp,"%5d",&mtk[i][j]); if(mtk[i][j]==1) m++; // dem so canh cua do thi } fclose(fp); printf("n Ma tran ke doc duoc:n"); for(i=1; i<=n; i++) { for(j=1;j<=n;j++) printf("%5d",mtk[i][j]); printf("n"); } //ghi lai danh sach ke theo khuon dang fp = fopen(dske,"w"); printf("n So dinh:%d",n); fprintf(fp,"%5dn",n);
  • 56. printf("n Danh sach ke:n"); for(i=1; i<=n; i++) { for(j=1;j<=n;j++) if(mtk[i][j]) {printf("%5d",j); fprintf(fp,"%5d",j); } printf("n"); fprintf(fp,"n"); } fclose(fp); //ghi lai danh sach canh theo khuon dang m = m/2; //lay so canh cua do thi fp = fopen(dscanh,"w"); fprintf(fp,"%d%5d",n,m); printf("n So dinh : %d, so canh:%d",n,m); printf("n Danh sach canh:"); for(i=1; i<n; i++){ for(j=i+1; j<=n; j++) { if(mtk[i][j]) {printf("n %3d%5d",i,j); fprintf(fp,"n%d%5d",i,j); } } fclose(fp); } void main() { chuyen_mtke(); getch(); } BÀI TẬP 87: Chuyển từ danh sách canh sang ma trận kề, danh sách kề #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h>
  • 57. #define MAX 10 char *dske="d:dske.out"; char *mtke="d:mtke.out"; char *dscanh="d:dscanh.in"; void chuyen_dscanh() { int i,j,dsc[MAX][MAX],mtk[MAX][MAX],n,m=0; FILE *fp; fp = fopen(dscanh,"r"); fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi printf("n So dinh do thi:%d, so canh cua do thi:%d",n,m); for(i=1; i<=m; i++) for(j=1; j<=m/2;j++) fscanf(fp,"%5d",&dsc[i][j]);//doc ds canh de in ra man hinh fclose(fp); printf("n Danh sach canh doc duoc:n"); for(i=1; i<=m; i++) { for(j=1;j<=m/2;j++) printf("%5d",dsc[i][j]); printf("n"); } //bat dau gan ma tran ke =0 for(i=1; i<=n; i++) for(j=1; j<=n;j++) mtk[i][j]=0; //lan luot doc cac canh (i,j) trong file fp=fopen(dscanh,"r"); fscanf(fp,"%d%5d",&n,&m); //doc so dinh va so canh cua do thi while(fscanf(fp,"%d%d",&i,&j)!=EOF) mtk[i][j]=mtk[j][i]=1; fclose(fp); //ghi lai ma tran ke theo khuon dang fp = fopen(mtke,"w"); printf("n So dinh:%d",n); fprintf(fp,"%5dn",n); printf("n Ma tran ke:n"); for(i=1; i<=n; i++)
  • 58. { for(j=1;j<=n;j++) printf("%5d",mtk[i][j]); fprintf(fp,"%5d",mtk[i][j]); printf("n"); fprintf(fp,"n"); } fclose(fp); //ghi lai danh sach ke theo khuon dang fp = fopen(dske,"w"); printf("n So dinh:%d",n); fprintf(fp,"%5dn",n); printf("n Danh sach ke:n"); for(i=1; i<=n; i++) { for(j=1;j<=n;j++) if(mtk[i][j]) {printf("%5d",j); fprintf(fp,"%5d",j); } printf("n"); fprintf(fp,"n"); } fclose(fp); } void main() { chuyen_dscanh(); getch(); } Bài 36 HD: * Cach 1: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su
  • 59. int B;//suc chua cai tui int A[MAX];//mang chua trong luong cua cac vat: a1,...,an int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu int stop=0;//stop=1 la ngung sinh day nhi phan ke tiep char *filename="d:data.in"; void DocFile() { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); } void KhoiTao() { FOPT = -32000; //gan gia tri toi uu ban dau //gan phuong an hien tai ban dau: x1=x2=...=xn=0 //va phuong an toi uu ban dau: xopt[1]=xopt[2]=...=xopt[n]=0
  • 60. for(int i=1; i<=n; i++) { X[i]=0; XOPT[i]=0; } } void DayNhiPhanKe()//tim day nhi phan ke tiep { int i=n; while(i>0 && X[i]==1) {X[i]=0;i--;} if( i==0) stop=1; else X[i]=1; } void CapNhatPATU()//cap nhat phuong an toi uu { //X1,...,Xn la day nhi phan ung voi phuong an hien tai //S la tong trong luong cac vat ung voi phuong an hien tai //P la tong gia tri cac vat ung voi phuong an hien tai int S=0, P=0; for( int i=1; i<=n ; i++)//tinh S va P { S = S + A[i] * X[i]; P = P + C[i] * X[i]; } //Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui //va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat if ( S<=B && FOPT < P) { FOPT = P; // Cap nhat gia tri toi uu moi for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi XOPT[i] = X[i]; } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file
  • 61. printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:"); for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); KhoiTao(); while(stop==0)//lan luot xet tat ca cac day nhi phan ung voi moi phuong an { CapNhatPATU(); DayNhiPhanKe(); } GhiFile(); } * Cach 2: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su int B;//suc chua cai tui int A[MAX];//mang chua trong luong cua cac vat: a1,...,an int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu char *filename="d:data.in"; void DocFile()
  • 62. { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); FOPT = -32000; //gan gia tri toi uu ban dau } void CapNhatPATU()//cap nhat phuong an toi uu { //X1,...,Xn la day nhi phan ung voi phuong an hien tai //S la tong trong luong cac vat ung voi phuong an hien tai //P la tong gia tri cac vat ung voi phuong an hien tai int S=0, P=0; for( int i=1; i<=n ; i++)//tinh S va P { S = S + A[i] * X[i]; P = P + C[i] * X[i]; } //Neu phuong an hien tai co tong trong luong cac vat<= suc chua cai tui //va tong gia tri cac vat > phuong an toi uu tam thoi thi cap nhat if ( S<=B && FOPT < P) { FOPT = P; // Cap nhat gia tri toi uu moi for(i=1; i<=n; i++) // Cap nhat phuong an toi uu moi XOPT[i] = X[i]; }
  • 63. } void Try(int i)//lan luot xet tat ca cac phuong an { for(int j=0;j<=1;j++) { X[i]=j; if(i==n) CapNhatPATU(); else Try(i+1); } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:"); for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); Try(1); GhiFile(); } * Cach 3: #include <stdio.h> #include <conio.h> #define MAX 100//so vat toi da int n;//so vat thuc su int B;//suc chua cai tui
  • 64. int A[MAX];//mang chua trong luong cua cac vat: a1,...,an int C[MAX];//mang chua gia tri cua cac vat: c1,...,cn //mot phuong an la mot day nhi phan x1,...,xn (xi=0/1) int X[MAX];//mang chua phuong an hien tai //phuong an toi uu la phuong an cho gia tri lon nhat int XOPT[MAX];//mang chua phuong an toi uu: xopt[i]=0/1 //gia tri toi uu la gia tri su dung ung voi phuong an toi uu int FOPT;//mang chua gia tri toi uu char *filename="d:data.in"; int S=0,P=0; void DocFile() { FILE *fp = fopen(filename,"r");//mo file du lieu de doc fscanf(fp, "%d%d", &n,&B);//doc so vat n va suc chua cai tui B printf("n So vat:%d",n); printf("n suc chua cai tui:%d",B); printf("n gia tri cua moi vat:"); for(int i=1; i<=n; i++) //doc gia tri cua moi vat c1,...,cn { fscanf(fp,"%d",&C[i]); printf("%4d",C[i]); } printf("n trong luong cua moi vat:"); for(i=1; i<=n; i++)//doc trong luong moi vat: a1,...,an { fscanf(fp,"%d",&A[i]); printf("%4d",A[i]); } fclose(fp); FOPT = -32000; //gan gia tri toi uu ban dau } void Try(int i)//lan luot xet tat ca cac phuong an { for(int j=0;j<=1;j++) { X[i]=j;S=S+A[i]*X[i];P=P+C[i]*X[i]; if(i==n)
  • 65. { if ( S<=B && FOPT < P) { FOPT = P; //Cap nhat gia tri toi uu moi for(int k=1; k<=n; k++) // Cap nhat phuong an toi uu moi XOPT[k] = X[k]; } } else if(S<B) Try(i+1); S=S-A[i]*X[i];P=P-C[i]*X[i]; } } void GhiFile() { // Dua ra ket qua toi uu FILE* fp = fopen("ketqua.out","w");//mo file ketqua de ghi fprintf(fp,"%dn",FOPT);//ghi gia tri toi uu vao file printf("n Gia tri toi uu :%d", FOPT); printf("n Phuong an toi uu:"); for(int i=1; i<=n; i++)//ghi phuong an toi uu vao file { printf("%3d",XOPT[i]); fprintf(fp,"%3d",XOPT[i]); } fclose(fp); } void main() { DocFile(); Try(1); GhiFile(); } Bài 38 #include <stdio.h> #include <math.h> #include <conio.h> int count=0;
  • 66. /* kiem tra K co la nguyen to kg? */ int ktnt(long K) { int nt=1; if(K==1) nt=0; for(long i=2;i<=sqrt(K);i++) if(K%i==0) {nt=0;break;} return nt; } /* ktra cac chu so cua K khac 0 va nguyen to */ int ktChuso(long K) {int cs,flag=1; while(K>0) { cs=K%10; K=K/10; if(cs==0||ktnt(cs)==0) flag=0; } if(flag) return 1; else return 0; } /* Kiem tra tong cac chu so cua K co la ngto */ int ktTong(long K) {long M=0;//M la tong cac chu so cua K int cs; while(K>0) { cs=K%10; K=K/10; M+=cs; } if(ktnt(M))
  • 67. return 1; else return 0; } /* Dao nguoc so K cung la ngto */ int ktDaoso(long K) {int cs; long Sodao=0; while(K>0) { cs=K%10; K=K/10; Sodao=Sodao*10+cs; } if(ktnt(Sodao)) return 1; else return 0; } /* tim so K */ void TimK() { for(long K=10000;K<=99999;K++) { if(ktnt(K)==1&&ktTong(K)==1&&ktChuso(K)==1&&ktDaoso(K)==1) { printf("n%d)%ld",++count,K); if(count%20==0) getch(); } } } void main() { printf("n1.K la so co 5 chu so"); printf("n2.K la so nguyen to"); printf("n3.Dao nguoc cac chu so cua K cung la so nguyen to");
  • 68. printf("n4.Tong cac chu so cua K cung la so nguyen to"); printf("n5.Cac chu so trong K deu khac 0 va la so ngto 1 chu so"); TimK();getch(); } bai 6 trang 103: vd pt 2x1+3x2+3x3=5 (n=3,b=5, a1=2, a2=a3=3) se co hai nghiem la: x=(1,0,1) va x=(1,1,0) #include <stdio.h> #include <conio.h> int x[100],a[100],n,b,count,s; void init() { printf("n="); scanf("%d",&n); for (int i=0;i<n;i++) { printf("a%d=",i+1); scanf("%d",&a[i]); } printf("b="); scanf("%d",&b); count=0; s=0; } void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]); } void Try(int i) { for (int j=0; j<=1; j++) { if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b { x[i]=j; //xac dinh x[i] s=s+a[i]*x[i]; //cap nhat bien trang thai s if (i==n-1) { if (s==b) result(); } else Try(i+1);
  • 69. s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 7 trang 103 vd pt: x1+2x2+3x3=20 (n=3,b=20, a1=1,a2=2,a3=3) se co 44 nghiem la: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0) #include <stdio.h> #include <conio.h> int x[100],a[100],n,b,count,s; void init() { printf("n="); scanf("%d",&n); for (int i=0;i<n;i++) { printf("a%d=",i+1); scanf("%d",&a[i]); } printf("b="); scanf("%d",&b); count=0; s=0; } void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]); } void Try(int i) { for (int j=0; j<=b/a[i]; j++)//cac gia tri x[i] co the nhan
  • 70. { if (s<=b) //dk de chap nhan x[i]=j la a[1]*x[1]+...+a[i-1]*x[i-1]<=b { x[i]=j; //xac dinh x[i] s=s+a[i]*x[i]; //cap nhat bien trang thai s if (i==n-1) { if (s==b) result(); } else Try(i+1); s=s-a[i]*x[i];//tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 9 trang 104 vd: N=5, tach N thanh 1 so, 2 so, 3 so, 4 so, 5 so 5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1 #include <stdio.h> #include <conio.h> int x[100],N,count,s,k,n; void init() { printf("N="); scanf("%d",&N); count=0; s=0; k=1; n=0; } void result() { count++; printf("n%3d) ",count); for (int i=0;i<n;i++) printf("%2d",x[i]);
  • 71. } void Try(int i) { for (int j=k; j<=N; j++)//cac kha nang cua x[i] { if (s<N) { x[i]=j; //xac dinh x[i] s=s+x[i]; k=j; n++; //cap nhat bien trang thai s,k,n if (s==N) result(); else if (s<N) Try(i+1); s=s-x[i]; n--; //tra lai gia tri cu cua bien trang thai s } } } void main() { clrscr(); init(); Try(0); getch(); } bai 10 trang 104: hinh vuong than bi Y tuong: (moi ma phuong la mot hoan vi) - tim tat ca cac hoan vi cua tap {1,...,n*n} - Kiem tra hoan vi nao la ma phuong thi in hoan vi do #include <stdio.h> #include <conio.h> int x[100], b[100],n,count; int a[10][10]; void init() { printf("n="); scanf("%d",&n); for (int i=0; i<n*n; i++) b[i]=1; //i chua su dung count=0; }
  • 72. int test() //kiem tra hoan vi co la ma phuong { int i, j, k, s, s0, s1, s2; //doi hoan vi thanh ma tran de de kiem tra t/c ma phuong i=0; j=0; for (k=0;k<n*n;k++) { a[i][j]=x[k]; j++; if (j==n) {i++; j=0;} } //kiem tra tong moi dong phai bang nhau s0=0;//gia tri dong 0 for (j=0;j<n;j++) s0=s0+a[0][j]; for (i=1;i<n;i++) { s=0;//gia tri dong i for (j=0;j<n;j++) s=s+a[i][j]; //neu dong i khac dong 0 thi khong phai ma phuong if (s!=s0) return 0; } //kiem tra cot s0=0;//gia tri cot 0 for (i=0;i<n;i++) s0=s0+a[i][0]; for (j=1;j<n;j++) { s=0;//gia tri cot j for (i=0;i<n;i++) s=s+a[i][j]; //neu cot j khac cot 0 thi khong phai ma phuong if (s!=s0) return 0; } //kiem tra duong cheo
  • 73. s1=0,s2=0; for (i=0;i<n;i++) { s1=s1+a[i][i]; s2=s2+a[i][n-1-i]; } if (s1!=s2) return 0; return 1; //hoan vi la ma phuong } void result() { if (test()) { count++; printf("nMa phuong %d:n",count); for (int i=0;i<n;i++) { for (int j=0;j<n;j++) printf("%3d",a[i][j]); printf("n"); } } } void Try(int i) { for (int j=0; j<n*n; j++) { if (b[j]) { x[i]=j+1; b[j]=0;//j su dung roi if (i==n*n-1) result(); else Try(i+1); b[j]=1; //tra lai trang thai cu, j chua su dung } } }