我去,被这题搞死了,写了我一晚上,蛋疼无比,总感觉一到细节的地方特别是涉及到数组下标计算的地方就不敢轻易下手写。。目测耗时近三小时。。无语,完全不在状态啊。。题目的话核心就是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;
}