程序设计与数据结构综合实践II第一周练习 A - Isenbaev's Number

Description

Isenbaev's Number: Isenbaev本人为0,Isenbaev的队友为1,Isenbaev的队友的队友为2,……以此类推 

Input

第一行:n ([1, 100]) 后n行:n支队伍的队友(三人)

Output

选手名称 Isenbaev's Number/n

Sample Input

inputoutput
7
Isenbaev Oparin Toropov
Ayzenshteyn Oparin Samsonov
Ayzenshteyn Chevdar Samsonov
Fominykh Isenbaev Oparin
Dublennykh Fominykh Ivankov
Burmistrov Dublennykh Kurpilyanskiy
Cormen Leiserson Rivest
Ayzenshteyn 2
Burmistrov 3
Chevdar 3
Cormen undefined
Dublennykh 2
Fominykh 1
Isenbaev 0
Ivankov 2
Kurpilyanskiy 3
Leiserson undefined
Oparin 1
Rivest undefined
Samsonov 2
Toropov 1
实现代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;

const int INF = 999;

int getIndex(vector<vector<string> > nameList, string name)
{
	for(int i = 0; i < nameList.size(); ++ i)
	{
		if(name == nameList[i][0])
		{
			return i;
		}
	}
	return -1;
}

bool ifExist(vector<string> nameList, string name)
{
	for(int i = 0; i < nameList.size(); ++ i)
	{
		if(name == nameList[i])
		{
			return true;
		}
	}
	return false;
}

bool cmp(vector<string> name1, vector<string> name2)
{
	return name1[0] < name2[0];
}

int main()
{
	vector<vector<string> > nameList;
	int n;
	cin >> n;
	string tem;
	getline(cin, tem);<span style="white-space:pre">		</span>、、
	for(int i = 0; i < n; ++ i)
	{
		string _names;
		string teammates[3];
		getline(cin, _names);
		for(int j = 0; j < 3; ++ j)
		{
			int firstSpaceIndex = _names.find_first_of(' ');
			teammates[j] = _names.substr(0, firstSpaceIndex);
			_names = _names.substr(firstSpaceIndex+1);
		}
		for(int j = 0; j < 3; ++ j)
		{
			int index = getIndex(nameList, teammates[j]);
			if(index == -1)
			{
				vector<string> tempPlayer;
				nameList.push_back(tempPlayer);
				nameList[nameList.size()-1].push_back(teammates[j]);
				index = nameList.size()-1;
			}
			for(int k = 0; k < 3; ++ k)
			{
				if(teammates[k] != nameList[index][0] && !ifExist(nameList[index], teammates[k]))
					nameList[index].push_back(teammates[k]);
			}
		}
	}
	sort(nameList.begin(), nameList.end(), cmp);
	
	vector<int> IseNum(nameList.size());
	for(int i = 0; i < nameList.size(); ++ i)
		IseNum[i] = INF;<span style="white-space:pre">	</span>//初始化
	if(getIndex(nameList, "Isenbaev") != -1)    //<span style="font-family: Arial, Helvetica, sans-serif;">Isenbaev可能不存在</span>

	{
		IseNum[getIndex(nameList, "Isenbaev")] = 0;
		queue<int> com;<span style="white-space:pre">			</span>//使用队列进行广度优先遍历
		com.push(getIndex(nameList, "Isenbaev"));
		while(!com.empty())
		{
			int q = com.front();
			com.pop();
			for(int k = 0; k < nameList[q].size(); ++ k)
			{
				int _index = getIndex(nameList, nameList[q][k]);
				if(IseNum[_index] > IseNum[q]+1)
				{
					IseNum[_index] = IseNum[q]+1;<span style="white-space:pre">	</span>//更新选手的<span style="font-family:Arial, Helvetica, sans-serif;">IseNum</span>
				}
			}
		}
	}
	for(int i = 0; i < IseNum.size(); ++ i)
	{
		cout << nameList[i][0] << " ";
		if(IseNum[i] < 999) cout << IseNum[i];
		else cout << "undefined";
		cout << endl;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值