已经在vs2013跑通代码,写了测试用例
#include "stdafx.h"
#include<iostream>
using namespace std;
/*
问题描述:
输入:
测试用例
人数n,朋友关系组数:m
m组朋友关系
输出:
成功配对情况种类
*/
/*
可能会出现重复计算问题:(0,1)和(1,0)应该是同一种分组情况,并且顺序会出现重复【(0,1)(2,3)】和【(2,3),(0,1)】不一样
解决办法:各操作阶段只为序列靠前的配上伙伴
*/
int areFriends[10][10] = {0};
bool taken[10] = { 0 };//判断token[i]是否已经配对,初始化是0,未配对
struct Friend
{
int x;
int y;
};
Friend stu[100];
int CountPair(bool taken[10],int n)
{
int firstFree = -1;
//找到第一个没有配对的元素,如果都已经配对好了,那么firstFree就不被更改,因此才可以进入下面的if (firstFree == -1)
for (int i = 0; i < n; i++)
{
if (taken[i] == 0)
{
firstFree = i;
break;
}
}
//所有学生都已经配好对了,因此firstFree=-1,组合数增加1
if (firstFree == -1)
return 1;
int ret = 0;
//选择与此学生组队的伙伴
for (int pairWith = firstFree + 1; pairWith < n; pairWith++)
{
if (taken[pairWith] == 0 && areFriends[firstFree][pairWith] != 0)//没有配对,并且具有伙伴关系
{
taken[firstFree] = taken[pairWith] = true;//配对成功
ret += CountPair(taken, n);//更新了taken
taken[firstFree] = taken[pairWith] = false;
}
}
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
//0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5
//0 1 1 2 2 3 3 0 0 2 1 3
int num, n, m;//num:测试用例,n:学生人数,m:朋友组数
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> n >> m;
//注意:需要清零初始化,否则在下次循环的时候会出现上次循环残留的数据导致最后输出结果不对
memset(stu, 0, sizeof(stu));
memset(areFriends, 0, sizeof(areFriends));
memset(taken, 0, sizeof(taken));
for (int ii = 0; ii < m; ii++)//输入m组朋友关系
{
cin >> stu[ii].x >> stu[ii].y;
areFriends[stu[ii].x][stu[ii].y] = 1;
areFriends[stu[ii].y][stu[ii].x] = 1;
}
int ret = CountPair(taken, n);
cout << ret << endl;
}
return 0;
}