fine,实习的时候lua的继承结构都是写好了的,就没有细看,直接用了,然后我这里的话,也不是很想在本机上装lua的运行环境,就用C++写了,然后这个过程的话,如果想要收集全部的匹配的话,会有点困难,因为好像复杂度很高,运行了很久都没出来,再就是收集到的集合没有去重,所以会收集到很多一样的匹配答案,后面我就按照随机的方法写了,只收集到一个合理的匹配就return掉。
#include<iostream>
#include<list>
#include<map>
#include<vector>
#include<time.h>
#include<Windows.h>
using namespace std;
struct player
{
int id;
int group;
int match;
player(int id, int group, int match=0)
{
this->id = id;
this->group = group;
this->match = match;
}
player()
{
}
};
bool isValidMatch(vector<player>&players)
{
int n = players.size()-1;
for(int i=1; i<=n; i++)
{
if(players[i].match==0) return false;
}
return true;
}
#define N 10
vector<int> findPeo(vector<player>&players, player p)
{
vector<int>res;
int n = players.size()-1;
for(int i=1; i<=n; i++)
{
if(p.group!=players[i].group && players[i].match==0)
{
res.push_back(players[i].id);
}
}
return res;
}
bool isAllMatch(vector<player>&players)
{
//开始匹配过程
int n = players.size()-1;
for(int i=1; i<=n; i++)
{
if(players[i].match==0) return false;
}
return true;
}
vector<map<int,int>>ans;
bool res= false;
void match (vector<player>&players)
{
if(res) return;
if(isAllMatch(players))
{
map<int,int>mp;
int n = players.size()-1;
for(int i=1; i<=n; i++)
{
int m=players[i].id;
int t=players[i].match;
if(m>t)
{
int temp = m;
m=t;
t=m;
}
if(!mp.count(m))
{
mp[m]=t;
}
}
ans.push_back(mp);
res=true;
return;
}
//开始匹配过程
int n = players.size()-1;
for(int i=1; i<=n; i++)
{
if(players[i].match==0)
{
vector<int> find = findPeo(players,players[i]);
if(find.size()==0)
{
return;
}
int len = find.size();
vector<bool>vis(len);
srand((unsigned int)time(NULL));
int index = rand()%len;
while(!vis[index])
{
vis[index]=true;
players[i].match = find[index];
players[find[index]].match = players[i].id;
match(players);
players[i].match = 0;
players[find[index]].match = 0;
}
}
}
}
vector<player> getInitPlayers()
{
//初始化数据
vector<player>players(1);
int id=0;
for(int i=1; i<=N; i++)
{
player p(++id, (id+1)/2);
players.push_back(p);
}
return players;
}
int main()
{
int cnt = 100;
for(int i=0; i<cnt; i++)
{
vector<player>data= getInitPlayers();
match(data);
for(int i = 0; i<ans.size(); i++)
{
for(auto v :ans[i])
{
cout<<v.first<<" vs "<<v.second<<endl;
}
cout<<endl;
}
ans.clear();
res=false;
cout<<endl;
Sleep(1000);
}
system("pause");
}