多边形游戏

介绍了一个基于多边形的游戏算法,玩家需要通过删除边并计算剩余顶点的值来得到最大值,涉及了图遍历和动态规划的思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

//多边形游戏: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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值