當前位置:首頁 » 編程語言 » c語言中permute
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中permute

發布時間: 2022-09-06 19:04:19

❶ 八皇後問題求解的實現演算法

#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]