上次的一个CrackMe就是用的这个螺旋数组,不过没有在比较时进行处理!
而且参与的字符也比较少,只是4*4的一个规则数组,一步步跟还是容易的,呵呵!
大家有兴趣,可以自己动手实现一个,用更多的字符来实现,在比较前,再进行一定的处理!
下面是源码,:/*
文件名:HelixArray.cpp
螺旋数组
作者:iawen
*/
#include<iostream>
using namespace std;
int main()
{
int nR,nC;
cout<<"请输入螺旋数组的维数(2维:行--列):";
cin>>nR>>nC;
cout<<"螺旋数组如下:\n";
int *nArray=new int[nR*nC];
int n=1;
int i=0,j=0;
int rowEnd=nR; //避免修改
int colEnd=nC; //避免修改
int nFlag=1; //指定赋值方向:1向右 2向下 3向左 4向上
while(1){
int row=i;
int col=j;
if(nFlag==1){
for(col=j;col<colEnd;col++){
*(nArray+(row*nC)+col)=n;
n++;
}
nFlag=2;
i++;
}
if(n>nR*nC)
break;
if(nFlag==2){
col--;
for(row=i;row<rowEnd;row++){
*(nArray+(row*nC)+col)=n;
n++;
}
nFlag=3;
colEnd--;
}
if(n>nR*nC)
break;
if(colEnd<=1)
break;
if(nFlag==3){
row--;
for(col=colEnd-1;col>=j;col--){
*(nArray+(row*nC)+col)=n;
n++;
}
nFlag=4;
rowEnd--;
}
if(n>nR*nC)
break;
if(rowEnd<=1)
break;
if(nFlag==4){
col++;
for(row=rowEnd-1;row>=i;row--){
*(nArray+(row*nC)+col)=n;
n++;
}
nFlag=1;
j++;
}
if(n>nR*nC)
break;
}
//输出显示数组
for(i=0;i<nR;i++){
for(j=0;j<nC;j++){
cout.width(3);
cout<<*(nArray+(i*nC)+j)<<" ";
}
cout<<endl;
}
delete [] nArray;
return 0;
}
运行效果如图:
附件为编译好的控制台程序:
[ 本帖最后由 chenguo 于 2009-1-14 10:17 编辑 ] |