❶ 八皇后问题求解的实现算法
#include <stdio.h>
#include <math.h>
#define N 8
void Check(int p[]){
int i,j;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(abs(p[j]-p[i])==j-i)
return;
for(i=0;i<N;i++)
printf("%d ",p[i]);
printf("\n");
}
void Permute(int n,int p[]){
int i,j;
if(n==1)
Check(p);
for(i=0,j=n-1;i<N;i++)
if(!p[i]){
p[i]=j; Permute(j,p); p[i]=0;
}
}
int main(){
static int p[N];
int n=N;
Permute(n+1,p);
return 0;
}
❷ 请教matlab中permute函数的意思或者非共轭转置是啥意思
这个相当于多维的矩阵转置。
比如说你这个例子,3维分别用1,2,3表示,相当于x,y,z坐标。
18个数字(1:18)最开始排列成3层。每一层是一个2×3的矩阵。这个矩阵可以看成是一个盒子,以xy面(1,2)为底面, 沿z(3)方向有3层,由下到上分别是:A(:,:,1),A(:,:,2),A(:,:,3)。
permute(A,[2,3,1])相当于把这个盒子的yz面(2,3)看成底面,x(1)方向向上,这样由下到上一共两层,分别是
1 7 13
3 9 15 和
5 11 17
2 8 14
4 10 16
6 12 18
二维的更形象,a=[1,2+j;3+2*j,4+5*j];permute(a,[2,1]),相当于把行(x)、列(y)互换;有别于转置(a'),你试一下就知道了。所以就叫非共轭转置。
三维以上我做不出这样形象的解释了。但是道理是类似的。
❸ c语言递归实现字典顺序枚
#include<stdio.h>
voidpermute(int);
#defineN7
inta[N];
intn=0;
voidmain()
{
inti;
for(i=0;i<N;i++)
{
a[i]=i+1;
}
permute(N);
printf("totalis:%d ",n);
}
voidpermute(intk)
{
inti,j,temp;
if(k==1)
{
for(i=0;i<N;i++)
{
printf("%d",a[i]);
}
printf(". ");
n++;
if(n%4==0)
{
printf(" ");
}
}
else
{
permute(k-1);
for(j=N-k+1;j<N;j++)
{
temp=a[N-k];
a[N-k]=a[j];
a[j]=temp;
permute(k-1);
temp=a[N-k];
a[N-k]=a[j];
a[j]=temp;
}
}
}
❹ 从m种不同元素里,每次取出n个元素, 元素可重复选取,不管顺序并成 一组,总的情况。求数学和C语言大神
#include<stdio.h>
inlinevoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
inlinevoidprint(intp[],intn)
{
inti;
for(i=0;i<n;i++)printf("%d",p[i]);
printf(" ");
}
inlinevoidpermute(intp[],intk,intn)//排列算法
{
intj;
if(k==n)
{
print(p,n);
}
else
{
for(j=k;j<n;j++)
{
swap(&p[k],&p[j]);//交换两个元素的位置
permute(p,k+1,n);//递归调用
swap(&p[j],&p[k]);//还原初始时状态
}
}
}
intmain()
{
inti,n;
intp[10];
printf("请输入取多少个(max9):");//输入n,最多选9个
scanf_s("%d",&n);
printf(" ");
for(i=0;i<n;i++)//假设有10个元素分别是1--10
{
p[i]=i+1;
}
permute(p,0,n);//调用排列函数
return0;
}
❺ c++ 枚举permutation
计算太复杂,超时了。。。能自己算掉的东西,就直接算掉写进去得了。
反正就2^(n-1)种排列组合方式,数组可以直接开辟固定大小的了,或者直接就能算出循环打印的次数了。(有内存大小的限制的话,就直接采用顺序计算打印的方法就好了。)
❻ 输入正整数n,输出整数1至n的各种排列
#include<iostream>
usingnamespacestd;
inta[4]={1,2,3,4};
voiddo_permute(intm,intN);
voidpermute(intN);
voidrotate(intm,intN);
intmain(intargc,char**argv)
{
intN;
cin>>N;
permute(N);
return0;
}
voiddo_permute(intm,intN)
{
staticintcounter=0;
if(m==0)
{
++counter;
//cout<<"#"<<counter<<": ";
for(inti=0;i<N-1;++i)
{
cout<<a[i]<<"";
}
cout<<a[N-1]<<endl;
return;
}
for(inti=0;i<m;++i)
{
do_permute(m-1,N);
rotate(m,N);
}
}
voidpermute(intN)
{
do_permute(N,N);
}
voidrotate(intm,intN)
{
inttemp=a[N-m];
for(intj=N-m;j<N-1;++j)
a[j]=a[j+1];
a[N-1]=temp;
}
//借鉴了他人的递归算法代码
//你自己改成纯c的版本吧,这个好改
❼ 希望能详细讲解一下整个运行步骤,尤其是for循环中permute(a,s+1,r) 和swap(a,s,i)
哥哥,permute(a,s+1,r)和swap(a,s,i)都是方法
void permute(int a[],int s,int r)
{
if(s<r)
{
for(int i=s;i<a.length;++i)
{
swap(a,s+1,r);
}
}else
{
System.out.println(Arrays.toString(Arrays.OfRange(a, 0, r)));
}
}
你这样看或许明白些,你这里还少一个swap方法没写
The swap(a,s,i) method swaps the array elements a[s] and a[i].
我英语不太好或许让你自己写这个方法- -.
❽ 用c语言写des加密算法
#include <stdio.h> #include <string.h> #include <windows.h> #include <conio.h> #include "Schedle.h" class CShift{ public: DWORDLONG mask[16]; int step[16]; CShift(){ for(int i=0;i<16;i++){ step[i]=2; mask[i]=0xc000000; } step[0]=step[1]=step[8]=step[15]=1; mask[0]=mask[1]=mask[8]=mask[15]=0x8000000; } }; class CDES{ public: CDES(){ m_dwlKey=0; m_dwlData=0; ConvertTableToMask(dwlKey_PC_1,64); //PrintTable(dwlKey_PC_1,7,8); ConvertTableToMask(dwlKey_PC_2,56); ConvertTableToMask(dwlData_IP,64); ConvertTableToMask(dwlData_Expansion,32); ConvertTableToMask(dwlData_FP,64); ConvertTableToMask(dwlData_P,32); Generate_S(); } void PrintBit(DWORDLONG); void EncryptKey(char *); unsigned char* EncryptData(unsigned char *); unsigned char* DescryptData(unsigned char*); private: void ConvertTableToMask(DWORDLONG *,int); void Generate_S(void); void PrintTable(DWORDLONG*,int,int); DWORDLONG ProcessByte(unsigned char*,BOOL); DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int); void Generate_K(void); void EncryptKernel(void); DWORDLONG Generate_B(DWORDLONG,DWORDLONG*); /*For verify schele permutation only*/ DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int); /**************************************/ DWORDLONG dwlData_S[9][4][16]; CShift m_shift; DWORDLONG m_dwlKey; DWORDLONG m_dwlData; DWORDLONG m_dwl_K[17]; }; void CDES::EncryptKey(char *key){ printf("\nOriginal Key: %s",key); m_dwlKey=ProcessByte((unsigned char*)key,TRUE); // PrintBit(m_dwlKey); m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56); // PrintBit(m_dwlKey); Generate_K(); // printf("\n******************************************\n"); } void CDES::Generate_K(void){ DWORDLONG C[17],D[17],tmp; C[0]=m_dwlKey>>28; D[0]=m_dwlKey&0xfffffff; for(int i=1;i<=16;i++){ tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]); C[i]=((C[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff; tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]); D[i]=((D[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff; m_dwl_K[i]=(C[i]<<28)|D[i]; m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48); } } DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){ unsigned char tmp; DWORDLONG byte=0; int i=0; while(i<8){ while(*key){ if(byte!=0) byte<<=8; tmp=*key; if(shift) tmp<<=1; byte|=tmp; i++; key++; } if(i<8) byte<<=8; i++; } return byte; } DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWOR 基于des算法的rfid安全系统
DLONG* dwlTable,int nDestLen){ int i=0; DWORDLONG tmp=0,moveBit; while(i<nDestLen){ moveBit=1; if(dwlTable[i]&dwlPara){ moveBit<<=nDestLen-i-1; tmp|=moveBit; } i++; } return tmp; } DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){ DWORDLONG tmp=0; int i=nDestLen-1; while(dwlPara!=0){ if(dwlPara&0x01) tmp|=dwlTable[i]; dwlPara>>=1; i--; } return tmp; } void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){ int i,j; for(i=0;i<row;i++){ printf("\n"); getch(); for(j=0;j<col;j++) PrintBit(dwlPara[i*col+j]); } } void CDES::PrintBit(DWORDLONG bitstream){ char out[76]; int i=0,j=0,space=0; while(bitstream!=0){ if(bitstream&0x01) out[i++]='1'; else out[i++]='0'; j++; if(j%8==0){ out[i++]=' '; space++; } bitstream=bitstream>>1; } out[i]='\0'; strcpy(out,strrev(out)); printf("%s **:%d\n",out,i-space); } void CDES::ConvertTableToMask(DWORDLONG *mask,int max){ int i=0; DWORDLONG nBit=1; while(mask[i]!=0){ nBit=1; nBit<<=max-mask[i]; mask[i++]=nBit; } } void CDES::Generate_S(void){ int i; int j,m,n; m=n=0; j=1; for(i=0;i<512;i++){ dwlData_S[j][m][n]=OS[i]; n=(n+1)%16; if(!n){ m=(m+1)%4; if(!m) j++; } } } unsigned char * CDES::EncryptData(unsigned char *block){ unsigned char *EncrytedData=new unsigned char(15); printf("\nOriginal Data: %s\n",block); m_dwlData=ProcessByte(block,0); // PrintBit(m_dwlData); m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64); EncryptKernel(); // PrintBit(m_dwlData); DWORDLONG bit6=m_dwlData; for(int i=0;i<11;i++){ EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46; bit6>>=6; } EncrytedData[11]='\0'; printf("\nAfter Encrypted: %s",EncrytedData); for(i=0;i<8;i++){ EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff); m_dwlData>>=8; } EncrytedData[8]='\0'; return EncrytedData; } void CDES::EncryptKernel(void){ int i=1; DWORDLONG L[17],R[17],B[9],EK,PSB; L[0]=m_dwlData>>32; R[0]=m_dwlData&0xffffffff; for(i=1;i<=16;i++){ L[i]=R[i-1]; R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48); //Expansion R EK=R[i-1]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation R[i]=L[i-1]^PSB; } R[16]<<=32; m_dwlData=R[16]|L[16]; m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64); } unsigned char* CDES::DescryptData(unsigned char *desData){ int i=1; unsigned char *DescryptedData=new unsigned char(15); DWORDLONG L[17],R[17],B[9],EK,PSB; DWORDLONG dataPara; dataPara=ProcessByte(desData,0); dataPara=PermuteTable(dataPara,dwlData_IP,64); R[16]=dataPara>>32; L[16]=dataPara&0xffffffff; for(i=16;i>=1;i--){ R[i-1]=L[i]; L[i]=PermuteTable(L[i],dwlData_Expansion,48); //Expansion L EK=L[i]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation L[i-1]=R[i]^PSB; } L[0]<<=32; dataPara=L[0]|R[0]; dataPara=PermuteTable(dataPara,dwlData_FP,64); // PrintBit(dataPara); for(i=0;i<8;i++){ DescryptedData[7-i]=(unsigned char)(dataPara&0xff); dataPara>>=8; } DescryptedData[8]='\0'; printf("\nAfter Decrypted: %s\n",DescryptedData); return DescryptedData; } DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){ int i,m,n; DWORDLONG tmp=0; for(i=8;i>0;i--){ block[i]=EKPara&0x3f; m=(int)(block[i]&0x20)>>4; m|=block[i]&0x01; n=(int)(block[i]<<1)>>2; block[i]=dwlData_S[i][m][n]; EKPara>>=6; } for(i=1;i<=8;i++){ tmp|=block[i]; tmp<<=4; } tmp>>=4; tmp=PermuteTable(tmp,dwlData_P,32); return tmp; } void main(void){ CDES des; des.EncryptKey("12345678"); unsigned char *result=des.EncryptData((unsigned char*)"DemoData"); des.DescryptData(result); }[1]