目录
【例4-4】旅行商问题(traveling salesman problem,TSP)——排列树
蛮力法(brute force):
【例4-1】链环数字对
问题分析
计算模型

算法设计与描述 | 算法分析 |
输入:n,x1,x2,....,xn | |
输出:有效数字对 | |
pair_digital(int n): { int a[10,10] <- {0} ; input( x1 ); for( i<- 1; i<n;i<-i+1) {
a[x1,x2] <- a[x1, x2]+1; x1<-x2; } for ( i<-0 ;i<10;i<-i+1 ) { for(j<-0 ;j<=i;j<-j+1) { if(a[i,j]!=0 and a[j,i]!=0) if(i!=j) output( (i,j) = a[i,j] , (j,i) =a[j,i ] ); else output( (i,j)=a[i,j]);//对角线元素 } } |
(1)输入n个元素,计数矩阵10*10 (2)核心语句包括两部分:统计和输出 (3) 当n>>100时,是上面的部分占比较大。 |
代码:
#include<iostream>
using namespace std;
int main()
{
int n=20;
int x[n]={0, 1, 5, 9 ,8 ,7, 2 ,2 ,2 ,3, 2, 7 ,8, 7 ,8 ,7, 9, 6, 5 ,9};
int a[10][10]={0,0};
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
a[i][j]=0;
}
}
for(int i=1;i<n;++i)
{
a[x[i-1]][x[i]] = a[x[i-1]][x[i]]+1;
// cout<<a[x[i-1]][x[i]]<<endl;
}
for(int i=0;i<10;++i)
{
for(int j=0;j<=i;++j)
{
if(a[i][j]!=0 && a[j][i]!=0)
{
if(i!=j)
{
cout<<"("<<i<<","<<j<<")="<<a[i][j]<<"\t";
cout<<"("<<j<<","<<i<<")="<<a[j][i]<<endl;
}else
{
cout<<"("<<i<<","<<j<<")="<<a[i][j]<<endl;
}
}
}
}
return 0;
}
/*
(2,2)=2
(3,2)=1 (2,3)=1
(7,2)=1 (2,7)=1
(8,7)=3 (7,8)=2
*/
【例4-2】解数字迷:

问题分析
思考题:ACM预测:

问题分析:
甲乙丙丁四位学生取得名次4*3*2*1种可能,一共是n!种可能,但是在约束条件下只有一种可能是正确的。因此用多重循环对每种可能的情况进行遍历,当符合条件时跳出循环。
计算模型:
甲乙丙丁设为int a,b,c,d;所存数字代表名次。
(1)a可能的名次是从1到4, for(a=1;a<=4;++a)
(2)b可能的名次是从1到4,for(b=1;b<=4;++b),且不等于a的名次(b!=a),
(3)c可能的名次是从1到4,for(c=1;c<=4;++c),且不等于a,b的名次(