游戏规则:一家6口(爸爸、妈妈、两个女儿、两个儿子)及警察和小偷要从河这边渡到河对岸。在河这边仅有一艘小舢板可以把他们载到对岸。可是,只有爸爸、妈妈和警察能够驾船,不论成人与小孩,每程只能承载二人。在渡河过程中,你要避免以下三种情况的发生:
(1) 当警察与小偷分开时,小偷会伤害一家6口;
(2) 当爸爸看见妈妈离开时,爸爸便会教训女儿;
(3) 当妈妈看见爸爸离开时,妈妈便会教训儿子。
有一段C代码,我看不懂,有人能给加一下注释吗?
代码见附件
#include<stdio.h>
#include<stdlib.h>
int c1(int x,int y)
{
return (x&y)==x;
}
int c2(int x)
{
if(x<128&&x>64)return 0;
if(c1(32,x)&&!c1(4,x)&&(c1(2,x)||c1(1,x)))
return 0;
if(!c1(32,x)&&c1(4,x)&&(c1(16,x)||c1(8,x)))
return 0;
return 1;
}
static int a[]={128+64,128+32,128+16,128+8,128+4,128+2,129,128,32+16,32+8,32+4,32,4+2,4+1,4};
void f(int x,int * pa,int n)
{
if(n>20) return;
if(x==0)
{
int i;
for(i=0;i<n;i++)
printf("%d\n",pa[i]);
exit(0);
}
int i;
for(i=0;i<15;i++)
{
if(n&&a[i]==pa[n-1]) continue;
if(n%2==0)
{
if(!c1(a[i],x)) continue;
if(!c2(x-a[i])) continue;
if(!c2(255-x+a[i])) continue;
pa[n]=a[i];
f(x-a[i],pa,n+1);
}
else
{
if(!c1(a[i],255-x)) continue;
if(!c2(255-x-a[i])) continue;
if(!c2(x+a[i])) continue;
pa[n]=a[i];
f(x+a[i],pa,n+1);
}
}
}
//jc 128
//xt 64
//bb 32
//de 16
//ee 8
//mm 4
//dg 2
//2g 1
int main()
{
int pa[1111];
f(255,pa,0);
}