导航菜单
首页 » 问答 » 正文

空当接龙算法.doc

空当接龙算法============================================================ int = 1; // 牌局号int cards[168], order[53];int i,j,k;for (i=0; i168; i++)cards[i] = -1;for (i=0; i=52; i++)order[i] = i;srand();for (i=0; i52; i++){j = rand() % order[52];k = i/8 + (i7) * 21;cards[k] = order[j];order[j] = order[52-i-1];--order[52];}for (i=0;i168;i++){if (cards[i] == -1)(%-10d, -1);else{k = ((cards[i]+1 % 13)+3) / 4;k = k?k:13; // 计算牌面大小(%-2d(%-2X), k, cards[i]);}}=============================================== 我把你的算法整理了一下1、压缩了放牌数组2、去掉了取牌队列最后一个位置3、明确了放牌是隔8个跳放4、显示通用的牌名5、算法更加明确化各位可以执行时,设置,对照空当接龙的选局号码看结果// .cpp : the entry point for the .//# .h# .hint main(int argc, char* argv[]){int = 1;// 牌局号int cards[64];// 放牌牌局int order[53];// 取牌队列int to;// 放牌位置int from;// 取牌位置int i;char hand[5]=CDHS;//花色:梅花,方片,红心,黑桃char num[14]=JQK;//for (i=0; i52; i++)order[i] = i;// 顺序摆好取牌队列for (i=0; i8*8; i++)cards[i] = -1;// 清除放牌牌面srand();//选局的号码,rand 的种子for (i=0; i52; i++){// 在当前的52-i的取牌队列中选一个位置 from 取牌// 随机数求余数后,保证 from 落在队列中实际有牌的位置from=rand() % (52-i);// 由于采用横向放牌:实际上每隔8个位置放一张牌:0,8,16,24...56,1,9...// 放牌牌局中位置to的值是i的低3位和高3位交换to = (i070)3| (i07) 3;// 取牌队列取第from个位置的牌 order[from],放入第to个位置 cards[to]cards[to] = order[from];// 第from个位置的牌 order[from],用最后一张牌order[52-i-1]补上,// 保证取牌队列不出现空位order[from] = order[52-i-1];// 每显示8张牌,换下一行if((i7)==0)(\n);// 显示这张牌是什么(%c%c , hand[cards[to]%4], num[cards[to]/4]);// 显示取牌位置和放牌位置(调试用)//(take %d to %d\n,from,to);}(\n);(); 0;} ============================================================标题: -1- 内容: 教你们解-1 -2 11982吧。

。。。 空当接龙可说是最耐玩的小游戏之一,尤其在办公一族中长盛不衰。 Win98中的空当接龙有32000局,Xp中有有局(其中8局无解)。 在空当接龙的帮助文件中,作者 Jim Horne 称:“虽然未经证明,但请您相信:所有的牌局最终都能移开。” 作者这句话并不是无根据的,接龙中有一个“撤销”秘籍,合理运用这个秘籍任何难关都可以攻破,下面以大家认为最无解的-1,-2,11982这3局为例: -1解法: 选局-2 方片2-上 草花2-方片3 选局-1 撤消红桃4-上 红桃6-上 红桃8-上 红桃10-上 红桃Q-黑桃K 草花K-空位 方便之门已经打开,接下来的容易 -2解法 选局-2 方片8-上 草花8-方片9 重玩 撤消 黑桃8-方片9 黑桃9-上 方片9黑桃8-黑桃10 重玩 撤消 芝麻开门咯,接下来比-1还容易 11982解法 选局11982 红桃2-黑桃3 红桃5-上 方片6-黑桃7 黑桃2-上 红桃8-上 红桃10-上 草花5-方片6 重玩 撤消 草花4-上 黑桃4-红桃5 红桃K-上 黑桃9-上 红桃2-黑桃3 方片6-黑桃7 方片Q-草花K 方片9-黑桃10 红桃9-草花10 黑桃8-方片9 草花10红桃9-空位 黑桃9-方片10 方片8-黑桃9 方片7-黑桃8 黑桃7方片6-方片8 草花2-上 方片5-上 红桃6-草花7 红桃3-黑桃4 方片5-下 草花4-方片5 红桃3-草花4 草花2-红桃3 黑桃4-上 红桃5-上 草花7红桃6-红桃8 红桃2-草花3 黑桃3黑桃4-黑桃2 红桃8草花7红桃6-草花9 红桃10-上 草花5-方片6 黑桃5-红桃6 黑桃Q-上 红桃4-草花5 红桃K黑桃Q-下 草花3红桃2-红桃4 黑桃K-上 黑桃J-方片Q 红桃10-黑桃J 黑桃J红桃10-方片Q 黑桃K-空位 方片Q黑桃J红桃10-黑桃K 草花K-上 方片J-黑桃Q 草花10红桃9-方片J 草花9红桃8黑桃7红桃6黑桃5-红桃10 草花K-下 红桃Q-草花K 草花8-红桃9 方片4-黑桃5 草花6-方片7 红桃5-草花6 草花J-红桃Q 草花Q-上 方片K-空位 草花Q-方片K 方片10黑桃9方片8黑桃7-草花J 红桃J-草花Q 红桃7-草花8 =========================================================# stdio.h# . char ** ; char * ; const char ** ; const char * ; (int n){ x = ()((char *)*n+(char)*n*n);int i;x[0]=(char *)(x+n);for(i=1;in;i++)x[i]=x[i-1]+n; x;}void ( x){free(x);} (int n){ x = ()((char)*n); x;}void ( x){free(x);}void ( A, B, int n){int i,j;for(i=0;in;i++){ for(j=0;jn;j++){A[i][j] ^= B[i][j]; }}}void ( a, b, int n){int i;for(i=0;in;i++)a[i]^=b[i];}void ( out, in1, in2, int n){int i,j,k;for(i=0;in;i++)for(j=0;jn;j++){ int sum=0; for(k=0;kn;k++){if(in1[i][k])sum^=in2[k][j]; } out[i][j]=sum;}}void ( out, m, in, int n){int i,j;for(i=0;in;i++){ int sum=0; for(j=0;jn;j++){sum^=m[i][j]in[j]; } out[i]=sum;}}void ( v, char c, int n){int i;for(i=0;in;i++)v[i]=c;}void ( o, int n){int i,j;for(i=0;in;i++)for(j=0;jn;j++)o[i][j]=0;}void ( m, char c, int n){int i,j;for(i=0;in;i++)for(j=0;jn;j++)m[i][j]=c;}void ( e, int n){ int j; (e,n); for(j=0;jn;j++)e[j][j]=1;}void ( h, int n){ int i; (h,n); for(i=0;in;i++){if(i=1)h[i][i-1]=1;h[i][i]=1;if(in-1)h[i][i+1]=1; }}void ( m, k, int n){int i,j;for(i=0;in;i++)for(j=0;jn;j++)m[i][j]=k[i][j];}void ( v, w, int n){int i;for(i=0;in;i++)v[i]=w[i];}void ( m, int n){int i,j;for(i=0;in;i++){ for(j=0;jn;j++){(%d,m[i][j]); } (\n);}}void ( v, int n){int i;for(i=0;in;i++)(%d,v[i]);(\n);}void Usage(const char *){(Usage:\n);(\t$%s n\n,);(\t\ n is a no more than 1000\n);(Or\n);(\t$%s [0|1]* [0|1]* ... [0|1]*\n, );(\t\tIn this , n of 0 and 1 and of each is n too\n);(The an n*n array. Each cell in the array has a a light. On of the in a cell will the state of in the cell as well as the in the of the cell, so could of 5 at most\n);(The will try to find a to turn all off\n);(The first of input gives an n*n array with all on\n);(The n of 0 and 1, and the of each n too. Each is to state of in one line of . A digit 0 means the light is off and 1 means the light ison.\n);(The will an n*n of 0 and 1 when a we need to touch a to turn off all the \nOr will \NO \ when no \n);exit(-1);} P0,P1,H; ME; init;//First we need to solve P*X(n) = ME;//There could be //For each X(n), try//X(n-1) = INIT+ H*X(n);//X(K) = INIT + H*X(k+1)+X(k+2);//for kn-1void Solve( P, ME, int n){int *;int =0;int i,j,k;int =0; = (int *)((int)*n);//First solve P*X(n) = MEfor(i=0;in;i++){ for(j=i;jn;j++)if(P[j][i]==1)break; if(j==n){//find a (ME[i]!=0){ =1;//No , does not since I want find out the }[++]=i; }else{if(j!=i){ //Swap line j and i int temp; for(k=i;kn;k++){temp=P[i][k];P[i][k]=P[j][k];P[j][k]=temp; } temp = ME[i]; ME[i] = ME[j]; ME[j] = temp;}for(j=0;jn;j++){ if(j!=iP[j][i]){//If P[j][i] is 1, add Line i into Line jfor(k=i;kn;k++){ P[j][k]^=P[i][k];}ME[j]^=ME[i]; }} }}(, = %d\n, );if(){ (NO \n); free(); ;}//Now ME holds one for X[n],//And reset index of ME to 0, 1// will in for X[n];// one { *x; x=( *)(()*n); for(i=0;in;i++)x[i]=(n); (x[n-1],ME,n); (x[n-2],H,x[n-1],n); (x[n-2],init[n-1],n); for(k=n-3;k=0;k--){(x[k],H,x[k+1],n);(x[k],init[k+1],n);(x[k],x[k+2],n); } (x,n); for(i=0;in;i++)(x[i]); free(x);}free();}int parse(int argc, char **argv){if(argc == 2){ int n = atoi(argv[1]); if(n0||n1000){Usage(argv[0]); }else if(n=1){(%d\n,n);exit(0); }else{init=(n);(init,1,n); n; }}else{ int n=argc-1; int i,j; init=(n); for(i=0;in;i++){char *s=argv[i+1];if((s)!=n){ (init); Usage(argv[0]);}for(j=0;jn;j++){ if(s[j]!=0s[j]!=1){(init);Usage(argv[0]); } init[i][j]=s[j]-0;} } n;}}int main(int argc, char **argv){int n;int i; ; ;if(argc2){Usage(argv[0]);}n=parse(argc,argv);#ifdef (Input:\n);(init,n);# = (n); = (n);P0 = (n);P1 = (n);H = (n); = (n);(H,n);(P0,n);(P1,n);#ifdef (P(0):\n);(P0,n);(P(1):\n);(P1,n);#or(ME, P0, init[0], n);(, P1, init[1], n);#ifdef (M(0):);(ME,n);(\n);(M(1):);(,n);(\n);#(ME,,n);#ifdef (S(1):);(ME,n);(\n);#(i=2;i=n;i++){(,H,P1,n); (,P0,n);//P(k)= H*P(k-1) + P(k-2) (P0,P1,n); (P1,,n);#ifdef DEBUG (P(%d):\n,i);(P1,n);#endif if(in){ (, P1, init[i], n); (ME,,n);#ifdef DEBUG (M(%d):,i);(,n);(\n); (S(%d):,i);(ME,n);(\n);#endif }}Solve(P1, ME, n);(init);(ME);();(P0);(P1);(H);(); 0;}=============================================================== I (j==n*n){iswap=index[--last];index[last]=index[i];index[i]=iswap;for(k=0;kn*n;++k){iswap=m[k][i];m[k][i]=m[k][last];m[k][last]=iswap;}Toif(j==n*n){iswap=index[--last];index[last]=index[i];index[i]=iswap;for(k=0;kn*n;++k){iswap=m[k][i];m[k][i]=m[k][last];m[k][last]=iswap;i--;}Then it seems to for n=47 in such

评论(0)

二维码