上课的时候突然发现这个算法有点小小的变动,就改了一下,大家慢慢看:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <iostream.H>
#define N 5 //可以通过改N的值来达到您的需求,当然如果你有兴趣的话,
// 也可以自己编写一个动态数组实现的来改进算法。^_^
char op[N];
int minf, maxf, m[N][N][2];
void PolyMax();
void MinMax(int i, int j, int k);
int main(int argc, char* argv[])
...{
int i;
char ch;
printf("********************************************************* ");
printf("* 实验二:多边形游戏 * ");
printf("********************************************************* ");
printf("请输入您要进行的六元算式,注意运算符只能是“+”或者“*”! S=");
for (i = 0; i < N; i ++) ...{
// printf("请输入一个顶点的值: ");
scanf("%d", &m[i][0][0]);
m[i][0][1] = m[i][0][0];
// printf("请输入一个运算符(+or*): ");
while((ch = getchar())&& isspace(ch));
op[i] = ch;
}
PolyMax();
return 0;
}
void PolyMax()
...{
int i, j, k, max,flag;
for (j = 1; j < N; j ++)
for (i = 0; i < N; i ++)
for (k = 0; k < j; k ++) ...{
MinMax(i, j, k);
if (m[i][j][0] > minf) m[i][j][0] = minf;
if (m[i][j][1] < maxf) m[i][j][1] = maxf;
}
max = m[0][N - 1][1];
flag=0+1;
for (i = 1; i < N; i ++)
if (max < m[i][N - 1][1])...{
max = m[i][N - 1][1];
flag=i+1;
}
printf("计算所得的最大值是:%d 这个最大值在删去边%d后得到。 ", max,flag);
}
void MinMax(int i, int j, int k)
...{
int e[4],
a = m[i][k][0],
b = m[i][k][1],
r = (i + k + 1) % N,
c = m[r][j - k - 1][0],
d = m[r][j - k - 1][1];
if (op[(r - 1 + N) % N] == '+') ...{
minf = a + c;
maxf = b + d;
} else ...{
e[0] = a * c;
e[1] = a * d;
e[2] = b * c;
e[3] = b * d;
minf = e[0];
maxf = e[0];
for (int k = 1; k < 4; k ++) ...{
if (minf > e[k]) minf = e[k];
if (maxf < e[k]) maxf = e[k];
}
}
}
#include <stdlib.h>
#include <ctype.h>
#include <iostream.H>
#define N 5 //可以通过改N的值来达到您的需求,当然如果你有兴趣的话,
// 也可以自己编写一个动态数组实现的来改进算法。^_^
char op[N];
int minf, maxf, m[N][N][2];
void PolyMax();
void MinMax(int i, int j, int k);
int main(int argc, char* argv[])
...{
int i;
char ch;
printf("********************************************************* ");
printf("* 实验二:多边形游戏 * ");
printf("********************************************************* ");
printf("请输入您要进行的六元算式,注意运算符只能是“+”或者“*”! S=");
for (i = 0; i < N; i ++) ...{
// printf("请输入一个顶点的值: ");
scanf("%d", &m[i][0][0]);
m[i][0][1] = m[i][0][0];
// printf("请输入一个运算符(+or*): ");
while((ch = getchar())&& isspace(ch));
op[i] = ch;
}
PolyMax();
return 0;
}
void PolyMax()
...{
int i, j, k, max,flag;
for (j = 1; j < N; j ++)
for (i = 0; i < N; i ++)
for (k = 0; k < j; k ++) ...{
MinMax(i, j, k);
if (m[i][j][0] > minf) m[i][j][0] = minf;
if (m[i][j][1] < maxf) m[i][j][1] = maxf;
}
max = m[0][N - 1][1];
flag=0+1;
for (i = 1; i < N; i ++)
if (max < m[i][N - 1][1])...{
max = m[i][N - 1][1];
flag=i+1;
}
printf("计算所得的最大值是:%d 这个最大值在删去边%d后得到。 ", max,flag);
}
void MinMax(int i, int j, int k)
...{
int e[4],
a = m[i][k][0],
b = m[i][k][1],
r = (i + k + 1) % N,
c = m[r][j - k - 1][0],
d = m[r][j - k - 1][1];
if (op[(r - 1 + N) % N] == '+') ...{
minf = a + c;
maxf = b + d;
} else ...{
e[0] = a * c;
e[1] = a * d;
e[2] = b * c;
e[3] = b * d;
minf = e[0];
maxf = e[0];
for (int k = 1; k < 4; k ++) ...{
if (minf > e[k]) minf = e[k];
if (maxf < e[k]) maxf = e[k];
}
}
}