tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
|
|
@ -0,0 +1,51 @@
|
|||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char sint;
|
||||
enum states { s_blnk = 0, s_tran, s_cont, s_disj };
|
||||
|
||||
/* Recursively look at each item in list, taking both choices of
|
||||
picking the item or not. The state at each step depends on prvious
|
||||
pickings, with the state transition table:
|
||||
blank + no pick -> blank
|
||||
blank + pick -> contiguous
|
||||
transitional + no pick -> transitional
|
||||
transitional + pick -> disjoint
|
||||
contiguous + no pick -> transitional
|
||||
contiguous + pick -> contiguous
|
||||
disjoint + pick -> disjoint
|
||||
disjoint + no pick -> disjoint
|
||||
At first step, before looking at any item, state is blank.
|
||||
Because state is known at each step and needs not be calculated,
|
||||
it can be quite fast.
|
||||
*/
|
||||
unsigned char tbl[][2] = {
|
||||
{ s_blnk, s_cont },
|
||||
{ s_tran, s_disj },
|
||||
{ s_tran, s_cont },
|
||||
{ s_disj, s_disj },
|
||||
};
|
||||
|
||||
void pick(sint n, sint step, sint state, char **v, unsigned long bits)
|
||||
{
|
||||
int i, b;
|
||||
if (step == n) {
|
||||
if (state != s_disj) return;
|
||||
for (i = 0, b = 1; i < n; i++, b <<= 1)
|
||||
if ((b & bits)) printf("%s ", v[i]);
|
||||
putchar('\n');
|
||||
return;
|
||||
}
|
||||
|
||||
bits <<= 1;
|
||||
pick(n, step + 1, tbl[state][0], v, bits); /* no pick */
|
||||
pick(n, step + 1, tbl[state][1], v, bits | 1); /* pick */
|
||||
}
|
||||
|
||||
int main(int c, char **v)
|
||||
{
|
||||
if (c - 1 >= sizeof(unsigned long) * 4)
|
||||
printf("Too many items");
|
||||
else
|
||||
pick(c - 1, 0, s_blnk, v + 1, 0);
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue