挺有意思的一个题目。
4个操作,要不做1次,要不不做。做2次等于没做。
0次操作,这不用说了……就是不操作
1次操作,我们可以执行1 ,2, 3, 4号操作
2次操作,我们可以【12】 【 13】 【14】 等等。 其中包括【什么都不操作】
3此操作,我们可以 123 124 …… 【1 22】, 【 2 33】,
4次操作,我们只可以 【1234】, 或者【11 22】,也就是【什么也不操作】
超过4次操作,我们可以用奇偶来判断,然后回归到原来的4个操作上去。
奇数操作的话,就一定是1,3次操作的组合。 偶数次操作的话,是0,2,4次的组合(其中4包括了0)。
所有操作暴力完成判断暴力排序即可。题目分析还算简单,其中注意无解的判断输出即可。
PS:为何我的程序总是比别人用更多的内存?
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, c;
bool s[101];
int end[101];
int save[16][101], tail = 0;
bool vis[16]={false};
//0关闭 1开启 -1随意
inline void change(int k) //k的情况
{
if (vis[k]) return; //这个情况是否已经CHECK过了
vis[k] = true;
memset(s, true, sizeof(s));
if (k & 1) memset(s, false, sizeof(s));
if (k & 2) for (int i = 1; i <= n; i += 2) s[i] = !s[i];
if (k & 4) for (int i = 2; i <= n; i += 2) s[i] = !s[i];
if (k & 8) for (int i = 1; i <= n; i += 3) s[i] = !s[i];
for (int i = 1; i <= n; ++ i)
if (end[i] == -1 || s[i] == end[i]) continue;
else return;
++ tail;
for (int i = 1; i <= n; ++ i) save[tail][i] = s[i];
}
inline void init()
{
ios::sync_with_stdio(false);
cin >> n >> c;
memset(end, -1, sizeof(end));
int tmp;
while (1)
{
cin >> tmp;
if (tmp == -1) break;
end[tmp] = 1;
}
while (1)
{
cin >> tmp;
if (tmp == -1) break;
end[tmp] = 0;
}
}
inline void makeit(int x)
{
if (x == 1)
{
change(1);
change(2);
change(4);
change(8);
}
if (x == 2)
{
change(3);
change(5);
change(6);
change(9);
change(10);
change(12);
}
if (x == 3)
{
change(1);
change(2);
change(7);
change(11);
change(13);
change(14);
}
if (x == 4)
{
change(15);
}
if (x == 0)
{
change(0);
}
}
inline void doit()
{
if (c == 0) makeit(0);
if (c == 1) makeit(1);
if (c == 2) makeit(2);
if (c == 3) makeit(3);
if (c == 4) makeit(4);
if (c > 4)
{
if (c % 2)
{
makeit(0);
makeit(4);
makeit(2);
}else{
makeit(1);
makeit(3);
}
}
if (!tail) {cout<<"IMPOSSIBLE"<<endl; return;}
/*sort*/
for (int i = 1; i < tail; ++ i)
{
for (int j = i + 1; j <= tail; ++ j)
{
bool flag = true;
for (int k = 1; k <= n; ++ k)
{
if (save[i][k] < save[j][k]) break;
if (save[i][k] > save[j][k])
{
flag = false;
break;
}
}
if (!flag) for (int k = 1; k <= n; ++ k) swap(save[i][k], save[j][k]);
}
}
for (int i = 1; i<= tail; ++ i)
{
for (int j = 1; j <= n; ++ j) cout<<save[i][j];
cout<<endl;
}
}
int main()
{
init();
doit();
}