ZOJ-1130

我去,被这题搞死了,写了我一晚上,蛋疼无比,总感觉一到细节的地方特别是涉及到数组下标计算的地方就不敢轻易下手写。。目测耗时近三小时。。无语,完全不在状态啊。。题目的话核心就是DFS一个符合题意的串,先把表打出来,然后根据输入查下

#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<map>

using namespace std;

namespace
{
	bool flag[1 << 15], find;
	map<int, vector<bool> > M;

	int number(vector<bool> &V, int n, int last)
	{
		int res = 0;
		for (size_t i = V.size() - n + 1; i < V.size(); i++)
		{
			res <<= 1;
			res |= V[i] ? 1 : 0;
		}
		res <<= 1;
		res |= last;
		return res;
	}

	int circle(vector<bool> &V, int n, size_t count)
	{
		int res = 0;
		for (size_t i = V.size() - n + count; i < V.size(); i++)
		{
			res <<= 1;
			res |= V[i] ? 1 : 0;
		}
		for (size_t i = 0; i < count; i++)
		{
			res <<= 1;
			res |= V[i] ? 1 : 0;
		}
		return res;
	}

	void dfs(vector<bool> &V, int depth, int n, int len)
	{
		if (find)
			return;

		if (depth == len)
		{
			for (int i = 1; i < n; i++)
			{
				int num = circle(V, n, i);
				if (flag[num])
					return;
			}
			find = true;
			M[n] = V;
			return;
		}

		for (int i = 0; i < 2; i++)
		{
			int num = number(V, n, i);
			if (!flag[num])
			{
				V.push_back(i);
				flag[num] = true;
				dfs(V, depth + 1, n, len);
				flag[num] = false;
				V.pop_back();
			}
		}
	}
}

int main()
{
	vector<bool> V;
	for (int i = 1; i < 16; i++)
	{
		V.clear();
		memset(flag, 0, sizeof(flag));
		for (int j = 0; j < i; j++)
			V.push_back(0);
		flag[0] = true;
		find = false;
		dfs(V, i, i, 1 << i);
	}

	int n, k;
	while (scanf("%d%d", &n, &k), n || k)
	{
		vector<bool> &v = M[n];
		int res = 0;
		for (int i = k; i < k + n; i++)
		{
			res <<= 1;
			res |= v[i % v.size()] ? 1 : 0;
		}
		printf("%d\n", res);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值