程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 225 - Golygons(暴力)

uva 225 - Golygons(暴力)

編輯:C++入門知識

題目鏈接:uva 225 - Golygons


題目大意:從(0,0)出發,每次走1,2,3...,n。能回到原點的方案,每次走完需要改變方向,也不可以往回走。然後會給出k個障礙物的坐標。不可以經過障礙物。並且停留的地方不可以重復。輸出所有方案,按照字典序。


解題思路:被坐標坑死了,一直RE,注意一下坐標關系就可以了,字典序可以從一開始找方向就處理掉。

還有多一條剪枝,就是當前位置太遠剩余的所有步數都不夠回道原點。


#include 
#include 
#include 

const int N = 250;
const int tmp = 105;
const int dir[4][2] = { {1, 0}, {0, 1}, {0, -1}, {-1, 0} };
const char sign[5] = "ensw";

int n, ans;
int g[N][N], v[N], sum[tmp];

void init() {
	ans = 0;
	memset(g, 0, sizeof(g));

	int a, b, k;
	scanf("%d%d", &n, &k);
	for (int i = 0; i < k; i++) {
		scanf("%d%d", &a, &b);
		if (abs(a) > tmp || abs(b) > tmp) continue;
		g[a+tmp][b+tmp] = -1;
	}
}

bool judge(int x, int y, int d, int k) {
	for (int i = 1; i <= k; i++) {
		x += dir[d][0]; y += dir[d][1];
		if (abs(x) > tmp || abs(y) > tmp) continue;
		if (g[x+tmp][y+tmp] == -1) return true;
	}
	if (abs(x) + abs(y) > sum[20] - sum[k]) return true;
	return false;
}

void dfs(int x, int y, int d, int f) {
	if (d > n) {
		if (x == 0 && y == 0) {
			for (int i = 1; i <= n; i++) printf("%c", sign[v[i]]);
			printf("\n");
			ans++;
		}
		return;
	}

	int& i = v[d];
	for (i = 0; i < 4; i++) {
		if (i == f || i + f == 3) continue;
		if (judge(x, y, i, d)) continue;
		int p = x + dir[i][0] * d, q = y + dir[i][1] * d;
		if (g[p+tmp][q+tmp]) continue;
		g[p+tmp][q+tmp] = 1;
		dfs(p, q, d + 1, i);
		g[p+tmp][q+tmp] = 0;
	}
}

int main() {
	sum[0] = 0;
	for (int i = 1; i <= 20; i++) sum[i] = sum[i-1] + i;
	int cas; scanf("%d", &cas);
	while (cas--) {
		init();
		dfs(0, 0, 1, -1);
		printf("Found %d golygon(s).\n\n", ans);

	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved