「個人特定問題」の編集履歴(バックアップ)一覧はこちら
「個人特定問題」(2010/06/09 (水) 16:28:29) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p>#include <stdio.h><br /><br />
#define M 11<br />
#define N 16<br /><br />
int data[M][N];<br /><br />
void input(){<br />
int i,j;char c;<br />
for(i=0;i<M;i++){<br />
for(j=0;j<N;j++){<br />
c=getchar();<br />
/* printf("input=%d\n",c);*/<br />
if(c!=10){data[i][j]=c-48;}<br />
if(c==10){j--;}<br />
}<br />
}<br />
}<br /><br />
void q_abi(int use[M],int see[N],double abi[M]){<br />
int i,j,n;<br />
for(i=0;i<M;i++){<br />
abi[i]=0;n=0;<br />
for(j=0;j<N;j++){<br />
if((use[i]==1)&&(see[j]==1)){<br />
/*
printf("data[%d][%d]=%d,abi[%d]=%lf\n",i,j,data[i][j],i,abi[i]);<br />
*/ n++;<br />
abi[i]=abi[i]+data[i][j];<br />
}<br />
}<br />
/* printf("abi[%d]=%.2lf n=%d abi/n=%lf |p|=%lf\n",
i,abi[i],n,abi[i]/n,(abi[i]/n-0.5)*(abi[i]/n-0.5));<br />
*/<br />
if(n>0){<br />
abi[i]=(abi[i]/n-0.5)*(abi[i]/n-0.5);}<br />
if(n==0){abi[i]=1;} <br />
/* printf("== abi[%d]=%.4lf\n",i,abi[i]);<br />
*/ }<br />
}<br /><br />
void crear(int use[M],int see[N],double abi[M]){<br />
int i;<br />
for(i=0;i<M;i++){use[i]=1;}<br />
for(i=0;i<N;i++){see[i]=1;}<br />
for(i=0;i<M;i++){abi[i]=0.0;}<br />
}<br /><br />
int cho_abi(int use[M],int see[N],double abi[M]){<br />
int i,n;double tmp=1;<br />
for(i=0;i<M;i++){<br />
if(abi[i]<tmp){<br />
tmp=abi[i];<br />
n=i;<br />
}<br />
}<br />
printf("cho q=%d\n",n);<br />
return n;<br />
}<br /><br />
void kaiseki(int n,int use[M],int see[N],double abi[M]){<br />
int seetmp[N];<br />
int mem,x,i;<br />
q_abi(use,see,abi);<br />
x=cho_abi(use,see,abi);<br />
use[x]=0;<br /><br />
printf("use[%d]=0\n",x);<br /><br />
mem=0;<br />
for(i=0;i<N;i++){<br />
mem=mem+see[i];<br />
}<br />
printf("mem=%d\n", mem);<br />
<br />
if(mem>2){<br />
/*x問題=0のメンバを抽出*/<br />
for(i=0;i<N;i++){<br />
seetmp[i]=0;<br />
if((data[x][i]==1)&&(see[i]==1)){<br />
seetmp[i]=1;<br />
}<br />
}<br />
kaiseki(n+1,use,seetmp,abi);<br />
<br />
/*x問題=1のメンバを抽出*/<br />
for(i=0;i<N;i++){<br />
seetmp[i]=0;<br />
if((data[x][i]==0)&&(see[i]==1)){<br />
seetmp[i]=1;<br />
}<br />
}<br />
kaiseki(n+1,use,seetmp,abi);<br />
}<br /><br />
if(mem==2){<br />
printf("ans=%d\n",n);<br />
}<br />
}<br /><br />
int main(){<br />
int use[M];int see[N];double abi[M];<br />
crear(use,see,abi);<br />
input();<br /><br />
kaiseki(1,use,see,abi);<br /><br />
return;<br />
}</p>