uva140-暴力枚举

Posted 菜菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva140-暴力枚举相关的知识,希望对你有一定的参考价值。

题意:任意一个点都至少有一个点与其相连接,所有的点可以进行任意排列,总排列数为n!.

一个点带宽定义与它相连的点的最远距离,一个排列的带宽定义为,点中最大的带宽,找出带宽最小的那个排列,有多组,输出字典序最小

#include<stdio.h>
#include<iostream>
#include<sstream>
#include<queue>
#include<map>
#include<memory.h>
#include <math.h>
#include<time.h>
#include <stdlib.h>
using namespace std;
char v[8];
char edge[100][100];
int tv = 0;
char res[8];
int maxl = 0x7fffffff;
int com(char r[])
{
	int max = -1;
	for(int i = 0; i < tv; i++)
	{
		char c = r[i];
		for(int j = 0; j < 100; j++)
		{
			if(edge[c][j] == ‘\0‘)
				break;
			char cc = edge[c][j];
			int k = 0;
			for(k = 0; k < tv; k++)
			{
				if(r[k] == cc)
					break;
			}
			int l = k - i;
			l = l < 0 ? l * -1 : l;
			max = max < l ? l : max;
		}
	}
	if(max < maxl)
	{
		maxl = max;
		memcpy(res, r, sizeof(char) * tv);
	}
	return 0;
}
void dfs(int cur, int vis[], char r[])
{
	if(cur == tv)
	{
		com(r);
		return;
	}
	for(int i = 0; i < tv; i++)
	{
		if(vis[i] == 1)
			continue;
		vis[i] = 1;
		r[cur] = v[i];
		cur++;
		dfs(cur, vis, r);
		cur--;
		vis[i] = 0;
	}

}

void sort()
{
	for(int i = 0; i < tv; i++)
	{
		for(int j = 1; j < tv - i; j++)
		{
			if(v[j - 1] > v[j])
			{
				char t = v[j - 1];
				v[j - 1] = v[j];
				v[j] = t;
			}

		}
	}
}

int main()
{
	//freopen("d:\\1.txt", "r", stdin);
	while (cin)
	{
		string str;
		cin >> str;
		if(str == "#")
			break;
		istringstream is(str);
		memset(edge, ‘\0‘, sizeof(edge));
		memset(v, ‘\0‘, sizeof(v));
		tv = 0;
		maxl = 0x7fffffff;
		int index[100];
		int mark[100][100];
		int mark2[100];
		memset(index, 0, sizeof(index));
		memset(mark, 0, sizeof(mark));
		memset(mark2, 0, sizeof(mark2));
		char c;
		char cc;
		while (is >> c)
		{
			if(c == ‘:‘)
			{
				continue;
			}
			if(c == ‘;‘)
			{
				is >> cc;
				if(mark2[cc] == 0)
				{
					v[tv++] = cc;
					mark2[cc] = 1;
				}
				continue;
			}
			if(tv == 0)
			{
				cc = c;
				mark2[cc] = 1;
				v[tv++] = cc;
				continue;
			}
			if(mark[cc][c] != 1)
			{
				edge[cc][index[cc]++] = c;
				mark[cc][c] = 1;
			}
			if(mark[c][cc] != 1)
			{
				edge[c][index[c]++] = cc;
				mark[c][cc] = 1;
			}
			if(mark2[c] == 0)
			{
				mark2[c] = 1;
				v[tv++] = c;
			}
		}
		//枚举
		int vis[10];
		memset(vis, 0, sizeof(vis));
		char r[8];
		sort();
		dfs(0, vis, r);

		for(int i = 0; i < tv; i++)
			cout << res[i] << " ";
		cout << "-> " << maxl << endl;

	}
	return 0;
}

  

以上是关于uva140-暴力枚举的主要内容,如果未能解决你的问题,请参考以下文章

UVa140 Bandwidth (枚举排列)

uva-10125-暴力枚举

UVa 10603 Fill [暴力枚举路径搜索]

UVa 1354 Mobile Computing[暴力枚举]

uva 12325 枚举暴力 b

uva-387-暴力枚举