//多边形游戏:n个顶点,n条边的多边形,每一个顶点有一个整数值,每一条边上有*或+,代表乘法和加法
//从中任意删除一条边,用相邻的顶点和关联的边上的运算符进行运算,运算结果产生新的顶点
//用新的顶点取代原来的两个顶点和他们关联的边,这样依次做下去,最后只剩一个顶点,求出最大的顶点值
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
//向量v1,v2用来保存计算过程
vector<int>v1;
vector<char>v2;
const int n=4; //多边形顶点数
typedef struct Connect //Connect表示哪一对顶点的连通与否
{
int vi; //顶点vi
int vj;
bool connected; //connected为true,表示vi,vj有边相连,connected为false,表示vi,vj没有有边相连
}Connect;
bool Visited[n]; //Visted[i]=true表示顶点已经被访问过
void Init(int *vertex,char edge[][n],Connect *conn) //初始化边数组顶点数组和conn数组
{
cout<<"请输入顶点所表示的整数值:"<<endl;
int i,j,k;
char e;
for(i=0;i<n;i++)
{
cout<<"第"<<i<<"个顶点所表示的整数值:";
cin>>vertex[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) edge[i][j]=edge[j][i]='\0';
}
cout<<"请输入"<<n<<"条边的信息:"<<endl;
for(k=0;k<n;k++)
{
cout<<"第"<<k<<"条边:";
cin>>i>>j;
cout<<"第"<<k<<"条边上的运算符是(*/+):";
cin>>e;
edge[i][j]=edge[j][i]=e;
conn[k].vi=i;
conn[k].vj=j;
conn[k].connected=true;
}
}
void Print(int *vertex,char edge[][n],Connect *conn)
{
int i,j;
for(i=0;i<n;i++)
{
cout<<"顶点"<<i<<"的整数值是:"<<vertex[i]<<endl;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(edge[i][j])
{
cout<<"边("<<i<<","<<j<<") 的运算符是:"<<edge[i][j]<<endl;
}
}
}
for(i=0;i<n;i++)
{
cout<<conn[i].vi<<" "<<conn[i].vj<<" "<<conn[i].connected<<endl;
}
}
//从顶点v开始DFS遍历图,统计运算结果,边(vi,vj)连接的
void Compute(int v,int& sum,int *vertex,char edge[][n],Connect *conn,int vi,int vj)
{
Visited[v]=true;
v1.push_back(vertex[v]);
int i;
for(i=0;i<n;i++)
{
if(!Visited[i] && edge[v][i] && !((v==vi && i==vj) || (v==vj && i==vi)))
{
if(sum==0) sum=vertex[v];
switch(edge[v][i])
{
case '+':
sum=sum+vertex[i];
v2.push_back('+');
break;
case '*':
v2.push_back('*');
sum=sum*vertex[i];
break;
}
Compute(i,sum,vertex,edge,conn,vi,vj);
}
}
}
void PolygonGame(int *vertex,char edge[][n],Connect *conn)
{
int i,j,k,p,Max=0,max,sum;
vector<int>::const_iterator it1;
vector<char>::const_iterator it2;
cout<<"计算过程是:"<<endl;
for(i=0;i<n;i++)
{
conn[i].connected=false; //将第i条边断开
max=0;
cout<<"从("<<conn[i].vi<<","<<conn[i].vj<<")处断开的计算过程是:"<<endl;
for(j=0;j<n;j++)
{
sum=0;
v1.clear();
v2.clear();
Compute(j,sum,vertex,edge,conn,conn[i].vi,conn[i].vj);
for(it1=v1.begin(),it2=v2.begin();it1!=v1.end() && it2!=v2.end();it1++,it2++)
{
cout<<*it1<<*it2;
}
for(;it1!=v1.end();it1++)
{
cout<<*it1;
}
for(;it2!=v2.end();it2++)
{
cout<<*it2;
}
cout<<"="<<sum<<endl;
for(p=0;p<n;p++) Visited[p]=0;
if(sum>max) max=sum;
}
if(max>Max)
{
Max=max;
k=i;
}
conn[i].connected=true;
}
cout<<"从("<<conn[k].vi<<","<<conn[k].vj<<")处断开"<<endl;
cout<<"最大运算结果是:"<<Max<<endl;
}
void main()
{
char edge[n][n]; //边矩阵,edge[i][j]存放着边<i,j>的"*"或"+"号
int vertex[n]; //顶点数组,vertex[i]表达顶点i的整数值
Connect conn[n];
Init(vertex,edge,conn);
Print(vertex,edge,conn);
PolygonGame(vertex,edge,conn);
}