%%随机生成16个9位二进制码按顺序赋给下列的单元格 A=randperm(512); B=A(1:16); M=[]; N=[];%用于存储联合的18位 for i=1:16 a=dec2bin(B(i),9); M=[M;a] end %%测试是不是唯一码 for i=1:12 if mod(i,4)~=0 temp1=strcat(M(i,:),M(i+1,:)) temp2=strcat(M(i+1,:),M(i,:)) temp3=strcat(M(i,:),M(i+4,:)) temp4=strcat(M(i+4,:),M(i,:)) N=[N;temp1;temp2;temp3;temp4] else temp1=strcat(M(i,:),M(i+4,:)); temp2=strcat(M(i+4,:),M(i,:)); N=[N;temp1;temp2]; end end for i=13:15 temp1=strcat(M(i,:),M(i+1,:)); temp2=strcat(M(i+1,:),M(i,:)); N=[N;temp1;temp2]; end N num1=length(N) num2=length(unique(N,'rows')) if num1~=num2 fprintf('不是唯一码') else fprintf('是唯一码') end 测试两个人的情况,已经修改了 %%该函数为测试4*4的格数,两个人的情况(这两个人是相同的) %%输入量B为待测的16个动态唯一码,obit为每个动态唯一码的位数 %%输出结果result为1则该测试的码是动态唯一可解码,为0则不是 %%注意一下函数只能测试16个的动态唯一码都是不相同的 %如若:B=[83 777 464 274 360 292 141 708 664 641 14 261 112 550 200 20]; %则测试函数为:result=test(B,obit);其中obit=10; %B=2.^(0:15);类同 function result=test_unique(B,obit) result=inf; M=[]; N=[];%用于存储联合的18位 R=[];%存放结果 dbit=2*obit; for i=1:16 a=dec2bin(B(i),obit); M=[M;a]; end %%测试是不是唯一码 for i=1:12 %%针对1,2.。。12 if mod(i,4)~=0 temp1=strcat(M(i,:),M(i+1,:)); temp2=strcat(M(i+1,:),M(i,:)); temp3=strcat(M(i,:),M(i+4,:)); temp4=strcat(M(i+4,:),M(i,:)); N=[N;temp1;temp2;temp3;temp4]; else temp1=strcat(M(i,:),M(i+4,:)); temp2=strcat(M(i+4,:),M(i,:)); N=[N;temp1;temp2]; end end %%剩余的13,14,15 for i=13:15 temp1=strcat(M(i,:),M(i+1,:)); temp2=strcat(M(i+1,:),M(i,:)); N=[N;temp1;temp2]; end %针对不动点 for i=1:16 temp1=strcat(M(i,:),M(i,:)); N=[N;temp1]; end N; num1=length(N); %%以下是找一个组合,达到满足约束条件 for i=1:num1 for j=i+1:num1 if (bin2dec(N(i,1:obit))~=bin2dec(N(j,1:obit)))&(bin2dec(N(i,obit+1:dbit))~=bin2dec(N(j,obit+1:dbit)))%排除两个人起点或终点相同的情况 if ~(bin2dec(N(i,1:obit))==bin2dec(N(i,obit+1:dbit))&bin2dec(N(j,1:obit))==bin2dec(N(j,obit+1:dbit)))%%排除两个人都不动的情况 if bin2dec(N(i,1:obit))~=bin2dec(N(j,obit+1:dbit))&bin2dec(N(i,obit+1:dbit))~=bin2dec(N(j,1:obit))%%排除两个人直线相邻互相向对方走的情况 a=bin2dec(N(i,:)); b=bin2dec(N(j,:)); t=dec2bin(bitor(a,b),dbit); R=[R;t]; end end end end end num2=length(R); temp=unique(R,'rows'); num3=length(unique(R,'rows')); num3=num3+18 ; %%排除相邻对角的情况,共有18种 if num3==num2 % fprintf('是唯一码') result=1; else % fprintf('不是唯一码') result=0; end