《算法问题实战策略》6-3郊游问题代码

已经在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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值