回复 10楼 fanpengpeng
我有穷举代码,但是我觉得这道题 其实可以用递归做。

有问题一起探讨,一起进步。
2013-04-26 16:12
2013-04-26 16:23
2013-04-26 16:37

2013-04-26 17:01
2013-04-26 17:21
程序代码:#include <stdio.h>
int move_zero(int buffer[],int i)
{
buffer[i]=1;
buffer[i+1]=0;
if(i+3>6)
{
buffer[i+3-7]=1;
buffer[i+3-7+1]=0;
}
else if(i+3==6)
{
buffer[i+3]=1;
buffer[0]=0;
}
else
{
buffer[i+3]=1;
buffer[i+3+1]=0;
}
return 0;
}
void print_buffer(int (*buffer)[7])
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<7;j++)
printf("%d\t",buffer[i][j]);
printf("\n");
}
}
int main()
{
int buffer[5][7]={
{0,1,1,0,1,1,1},
{0,1,1,0,1,1,1},
{0,1,1,0,1,1,1},
{0,1,1,0,1,1,1},
{0,1,1,0,1,1,1},
};
int i[5]={0,0,0,0,0};
int j = 0,temp = 0;
for(i[0]=0;i[0]<6;i[0]++)//a
{
move_zero(buffer[0],i[0]);
if(buffer[0][2] != 1)
continue;
for(i[1]=0;i[1]<6;i[1]++)//b
{
move_zero(buffer[1],i[1]);
if(buffer[1][6] != 0)
continue;
for(i[2]=0;i[2]<6;i[2]++)//c
{
move_zero(buffer[2],i[2]);
temp = 0;
for(j=0;j<7;j++)
{
if(buffer[0][j]==1 && buffer[2][j]==1)
temp+=1;
}
if(temp<4)
continue;
for(i[3]=0;i[3]<6;i[3]++)//d
{
move_zero(buffer[3],i[3]);
if(buffer[3][6]!=0)
continue;
temp =0;
for(j=0;j<7;j++)
{
if(buffer[0][j]+buffer[1][j]+buffer[2][j]+buffer[3][j]<2)
break;
}
if(j<7)
continue;
for(i[4]=0;i[4]<6;i[4]++)//e
{
move_zero(buffer[4],i[4]);
if(buffer[4][2] != 1)
continue;
if(buffer[4][6] !=0)
continue;
print_buffer(&buffer[0]);
printf("\n");
}
}
}
}
}
return 0;
}哎,我想到的就是这样了
2013-04-26 17:23
2013-04-26 17:23
2013-04-26 17:38
程序代码:
#include <stdio.h>
char *A[7] = { /* 规则1 */
"0110111",
"0111011",
"1011011",
"1011101",
"1101101",
"1101110",
"1110110"
};
char *B[5]; /* 所有人员的安排矩阵 每位人员的安排方式从A中抽取 */
void solve(int i)
{
if (i < 5) { /* 递归穷举 */
for (int j=0; j<7; j++) {
B[i] = A[j];
solve(i+1);
}
} else { /* 规则检查 */
/* Rule 4, 5 */
if (B[1][6]!='0' || B[3][6] != '0' || B[4][6]!='0' ||
B[0][2]!='1' || B[4][2]!='1') return;
/* Rule 2, 3, 6 */
int m, n, f, r2=0, r3=0, r6=0;
for (m=0; m<7; m++) {
for (r3=0, f=1, n=0; n<5; n++) {
if (n<4 && B[n][m]=='1') ++r3;
if (B[n][m]=='0') f=0;
}
if (r3 < 2) return;
if (f == 1) ++r2;
if (B[0][m]=='1' && B[2][m]=='1') ++r6;
}
if (r2<3 || r6<4) return;
/* Print */
for (m=0; m<5; m++)
printf("%s\n", B[m]);
printf("\n");
}
}
int main()
{
solve(0);
return 0;
}

2013-04-26 18:49
2013-04-26 19:52