算法

五、算法源代码及用户屏幕
1.(1)算法源码

/***************************************
八皇后问题。
codeblocks C++
2018.11.3
***************************************/
#include
#include
using namespace std;

#define N 8 //定义皇后数量
int countN = 0;

int tryN(int n, int a[N][N], int m[], int right[], int left[]); //检测皇后摆放方式
void printN(int a[N][N]); //打印皇后摆放位置

int main()
{
int a[N][N] = {0}; //摆放皇后的数组
int m[N] = {0}; //同一竖排
int right[N2] = {0}; //右斜对角线
int left[N
2] = {0}; //左斜对角线

int countN = tryN(0, a, m, right, left);
cout<<"count = "<<countN<<endl;

return 0;

}

int tryN(int n, int a[N][N], int m[], int right[], int left[]){
for(int j=0; j<N; j++){
if(!m[j] && !right[n-j+N] && !left[n+j]){ //位置安全
//放皇后
a[n][j] = n+1;
m[j] = right[n-j+N] = left[n+j] = 1;
if(n == N-1){ //已经到最后一行
printN(a);
countN++;
}
else{ //检测下一行
tryN(n+1, a, m, right, left);
}
//回溯,去掉该皇后
a[n][j] = 0;
m[j] = right[n-j+N] = left[n+j] = 0;
}
}
return countN;
}

void printN(int a[N][N]){
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cout<<setw(2)<<a[i][j];
}
cout<<endl;
}
cout<<endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
(2)用户屏幕
Alt

2.(1)算法源码

/************************************
批处理作业调度问题
codeblocks C++
2018.11.4
************************************/
#include
#include
using namespace std;

const int num = 100;
int m1Time[num]; //作业在机器1上花费的时间
int m2Time[num]; //作业在机器2上花费的时间
int workBest[num]; //记录最有作业调度方法
int work[num]; //记录当前作业调度方法
int timeCurrent = 0;
int timeBest = 9999;
int timeM1 = 0; //记录机器1上用时
int timeM2[num] = {0}; //记录每个作业总用时,从下标1开始

void backTrack(int deep, int workNumber);

int main()
{
//用时输入作业数量与在机器1、2上的用时
int workNumber;
cout<<"Enter work numbers : “;
cin>>workNumber;
cout<<“work m1 m2”<<endl;
for(int i=0; i<workNumber; i++){
cout<<” “<<i+1<<” ";
cin>>m1Time[i];
cin>>m2Time[i];
}

for(int i=0; i<workNumber; i++){
    workBest[i] = i;  //顺序调度,编号-1
    work[i] = i;
}
backTrack(0,workNumber);

cout<<"BestTime : "<<timeBest<<endl;
cout<<"Scheduling sort : "<<endl;
for(int i=0; i<workNumber; i++)
    cout<<workBest[i]+1<<"  ";
cout<<endl;

return 0;

}

void backTrack(int deep, int workNumber){
if(deep >= workNumber){ //到底叶节点
if(timeCurrent < timeBest){
//该调度方法为最佳方法,更新最佳方法的数据
for(int i=0; i<workNumber; i++){
workBest[i] = work[i];
}
timeBest = timeCurrent;
}
}
else{
for(int i=deep; i<workNumber; i++){
//从剩余的作业中选择一个与当前作业交换位置
int temp = work[deep];
work[deep] = work[i];
work[i] = temp;

        timeM1 += m1Time[work[deep]];    //在机器1上总用时
        //作业deep+1在机器2上的完成时间和

//在机器1完成时间如果大于上一个作业时间,则直接进入机器2继续,
//反之,如果小于上一个作业完成时间,则需要继续等待,直到上一个作业完成
timeM2[deep+1] = (timeM2[deep] > timeM1 ? timeM2[deep]:timeM1 ) + m2Time[work[deep]];
//该调度当前总用时
timeCurrent += timeM2[deep+1];

        if(timeCurrent < timeBest){
            backTrack(deep+1,workNumber);
        }

        timeM1 -= m1Time[work[deep]];
        timeCurrent -= timeM2[deep+1];

        temp = work[deep];
        work[deep] = work[i];
        work[i] = temp;
    }
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(2)用户屏幕
Alt
Alt

3.(1)算法源码

/**************************************
N个自然数全排列问题。
codeblocks C++
2018.11.3
****************************************/
#include
using namespace std;

void backtrack(int deep, int number, int a[]);

int main(){
int number;
int a[9];
cout<<"Enter a number : ";
cin>>number;

backtrack(0,number,a);

return 0;

}

void backtrack(int deep, int number, int a[]){
if(deep >= number){ //到底叶节点,输出结果
for(int i=0; i<number; i++)
cout<<a[i]+1<<" ";
cout<<endl;
}
for(int i=0; i<number; i++){ //继续选择数字排列
bool flag = true;
for(int j=0; j<deep; j++){ //判断该数字是否已使用
if(a[j] == i)
flag = false;
}
if(flag){
a[deep] = i;
backtrack(deep+1,number,a);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(2)用户屏幕
Alt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值