Wormholes

2034 단어 C++수색 하 다.
http://train.usaco.org/usacoprob2?a=ekO1ud5KpT4&S=wormhole
제목 의 대의:
N 개의 벌레 구멍 의 좌 표를 알 고 있 으 며,2 개의 벌레 구멍(A,B)이 서로 연결 되면 A 에서 B 로 들 어가 고,B 에서 A 로 들 어 갈 수 있다.젖 소 는 농장 에서 마음대로 오른쪽으로 곧장 가서 젖소 가 벌레 구멍 사이 에서 무한 순환 할 수 있 는 모든 벌레 구멍 배합 상황 을 찾 아 냈 다.
#include <iostream>
#include <fstream>
//1.          
//2.                   ,         (            ,       )
//                     
using namespace std; 
struct wormholes
{
	int x;
	int y;
	int next;
	int paired;
} a[15];
int n, ans;
bool isok()					//          
{
	int i, j, k;
	for(i = 1; i <= n; i++)  // n          
	{	
		k = i;
		for(j = 0; j <= n; j++, k = a[a[k].paired].next)
			if(a[a[k].paired].next == -1) break;
		if(j > n) return true;
	}
	return false;
}
 
void dfs(int m)				//       		  :     
{
	if(m == n/2)
		if(isok()) 
		{
			ans++;
			return;
		}
	int i;
	for(i = 1; i <= n; i++)					//        
		if(a[i].paired == -1)
			break;
	for(int j = i + 1; j <= n; j++)			//               (         ) 
		if(a[j].paired == -1)
		{
			a[i].paired = j;
			a[j].paired = i;
			dfs(m + 1);
			a[i].paired = -1;
			a[j].paired =-1;
		}
}

int main()
{
	ifstream fin("wormhole.in");
	ofstream fout("wormhole.out");
	ans = 0;
	fin >> n;
	for(int i = 1; i <= n; i++) fin >> a[i].x >> a[i].y;		//      
	//            ,         ,     -1; 
	for(int i = 1; i <= n; i++)
	{
		//       ,      x     
		a[i].paired = -1;
		a[i].next = -1;
		for(int j = 1; j <= n; j++)
			if(a[j].y == a[i].y && (a[j].x > a[i].x &&  (a[i].next == -1 || a[j].x < a[a[i].next].x)))
				a[i].next = j;
	}
//	for(int i = 1; i <= n; i++) cout << a[i].next <<" ";
	dfs(0);
	fout << ans << endl;
	fout.close();
	return 0;
}

요약:
표지 판 을 보고 나 서 야 썼 다.
프로그램 데이터 가 많 지 않 으 면 가장 직관 적 인 이해 방식 으로 해결 할 수 있다.따라서 이런 문 제 는 먼저 생각 을 정리 하고 문제 의 요구 에 따라 해결 과정 에서 필요 한 데 이 터 를 분석 해 야 한다.먼저 데이터 문 제 를 해결 하고 데이터 에 근거 하여 구체 적 인 알고리즘 문 제 를 해결한다

좋은 웹페이지 즐겨찾기