| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:加了注释 并修改过的代码,帮忙看看,谢了。(其中对每个位置的操作是用位运算进行的)In Reply To:哪位大牛帮忙看看我写的枚举,已经交了快20遍了 Posted by:ydy_kid at 2008-10-10 21:45:34 #include<stdio.h>
#include"conio.h"
static long int na,vv[16]/*存2的次方数*/,c[4][4]/*4*4方格*/,flips[16]/*16个位置操作对应的整形数*/,n;
long int chang(long int a[4][4],long int vv[16])
{long int i,j,k;
k=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
k+=a[i][j]*vv[i*4+j];
return(k);
} /*将4*4二进制转化为整形数*/
void tryy( long int i,long int j,long int k);/*枚举函数*/
main()
{long int i,j,m,aa,bb;
char s[4];long int pp[4][2]={{1,0},{-1,0},{0,1},{0,-1}}/*一个位置对应4个位置的坐标操作*/;
vv[0]=1;
for(i=1;i<16;i++)
vv[i]=vv[i-1]*2;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
c[i][j]=0;
/*初始化4*4方格*/
for(i=0;i<16;i++)
{aa=i/4;bb=i%4;
c[aa][bb]=1;
for(j=0;j<4;j++)
if((aa+pp[j][0]>=0)&&(aa+pp[j][0]<=3)
&&(bb+pp[j][1]>=0)&&(bb+pp[j][1]<=3))
c[aa+pp[j][0]][bb+pp[j][1]]=1;
flips[i]=chang(c,vv);
c[aa][bb]=0;
for(j=0;j<4;j++)
if((aa+pp[j][0]>=0)&&(aa+pp[j][0]<=3)
&&(bb+pp[j][1]>=0)&&(bb+pp[j][1]<=3))
c[aa+pp[j][0]][bb+pp[j][1]]=0;
}
/*记录16个位置位运算操作的整形数*/
m=0;
for(i=0;i<4;i++)
{scanf("%s",s);
for(j=0;j<4;j++)
if(s[j]=='b')
m+=vv[i*4+j];
} /*输入*/
n=20;
tryy(m,0,0);/*枚举*/
if(n<20)printf("%ld\n",n);
else printf("Impossible\n");/*输出*/
}
void tryy(long int i,long int j,long int k)
{
if(j>15)
{if((i==0)||(i==65535))
if(k<n)n=k;
return;
}
tryy(i^flips[j],j+1,k+1);
tryy(i,j+1,k);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator