acm

1.1 数组和字符串

1.1.1 一维数组倒置 要求不增加额外的内存空间

 const int MAX=20;

void Fun(int *a,int n)

{

   int *p,*q,t;

   int m=n/2;

   for(p=a,q=a+n-1;p<q;p++,q--)

   {

          t=*p;

          *p=*q;

          *q=t;

   }

}

int _tmain(int argc, _TCHAR* argv[])

{

       int num,i;

       int data[MAX];

       fstream cin("data.txt");

       cin>>num;

       for(i=0;i<num;i++)

              cin>>data[i];

       for(i=0;i<num;i++)

        cout<<data[i]<<" ";

       cout<<endl;

       Fun(data,num);

       for(i=0;i<num;i++)

        cout<<data[i]<<" ";

       cout<<endl;

       cin.get();

       cin.get();

       return 0;

}

参考代码Fun(int *x,int n);

#include<stdio.h>

#define M 20

void fun(int *x,int n)

{

    int *p,m=n/2,*i,*j;

    i=x;

    j=x+n-1;

    p=x+m;

    for(;i<p;i++,j--)

    {

        int t=*i;

        *i=*j;

        *j=t;

    }

}

void main()

{

    int i,a[M],n;

    printf("/nEnter n:/n");

    scanf("%d",&n);

    printf("The original array:/n");

    for(i=0;i<n;i++)

        scanf("%d",a+i);

    fun(a,i);

    printf("/nThe array inverted:/n");

    for(i=0;i<n;i++)

        printf("%d  ",*(a+i));

}

1.1.2 一维数组应用 n

#include <iostream>

#include <queue>

#include <string>

using namespace std;

 

const int MAX=100;

int main()

{

       unsigned int a[MAX];

       memset(a,0,sizeof(a));

       int n,i,j,m;,

       int dig=1,p=1;

       a[0]=1;

       a[1]=1;

       cin>>n;

       for(i=1;i<=n;i++)

       {

              for(j=1;j<=dig;j++)

              {

                     a[j]*=i;

              }

              for(m=1;m<=dig;m++)

                            {

                                   if(a[m]>=10)

                                   {

                                   a[m+1]+=a[m]/10;

                                   a[m]=a[m]%10;

                                   p=m+1;

                                   }

                                  

                            }

              if(p>dig) dig=p;

              cout<<i<<"!=";

              for(j=dig;j>0;j--)

                     cout<<a[j];

              cout<<endl;

 

       };

       cin.get();

       return 0;

}

参考代码:(运行时出现一点问题,结果正常显示)

#include"stdio.h"

void main()

{

       int Data[40];

       int Digit;

       int i,j,r,k;

       int N;

       for(i=1;i<41;i++)

              Data[i]=0;

       Data[0]=1;

       Data[1]=1;

       Digit=1;

       printf("Enter a number what you want to calculus:");

       scanf("%d",&N);

       for(i=1;i<N+1;i++)

       {

              for(j=1;j<Digit+1;j++)

                     Data[j]*=i;

              for(j=1;j<Digit+1;j++)

              {

                     if(Data[j]>10)

                            {

                                   for(r=1;r<Digit+1;r++)

                                   {

                                          if(Data[Digit]>10)

                                                        Digit++;

                                                 Data[r+1]+=Data[r]/10;

                                                 Data[r]=Data[r]%10;

                                   }

                            }

              }

              printf("%d!= ",i);

              for(k=Digit;k>0;k--)

                     printf("%d",Data[k]);

              printf("/n");

       }

}

 

.1.4 显示杨辉三角 递归计算10以内较快

 

#include <iostream>

using namespace std;

const MAX=100;

int a[MAX];

int b[MAX];

int Fun(int x,int y)

{

       int z;

       if(y==1||y==x+1)

              return 1;

    z=Fun(x-1,y-1)+Fun(x-1,y);

       return z;

}

int main()

{

       int i,j;

       int n,count=1;

       cin>>n;

       for(i=0;i<=n;i++)

       {

              for(j=1;j<=n+1;j++)

              {

                     cout<<Fun(i,j)<<" ";

                     if(count==j) break;

              }

              count++;

              cout<<endl;

       }

       return 0;

 

}

 

 

 

参考代码:

#include<stdio.h>

void main()

{

    int i,j,n=13;

    printf("N=");

    while(n>12)

    scanf("%d",&n); /*控制输入正确的值以保证屏幕显示的图形正确*/

    for(i=0;i<=n;i++) /*控制输出N*/

    {

        for(j=0;j<24-2*i;j++)

            printf(" "); /*控制输出第i行前面的空格*/

        for(j=1;j<i+2;j++)

            printf("%4d",c(i,j)); /*输出第i行的第j个值*/

        printf("/n");

    }

}

int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/

{

    int z;

    if((y==1)||(y==x+1))

    return 1; /*若为x行的第1或第x+1列,则输出1*/

    z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/

    return z;

}

 

 

非递归实现,思路所有数据计算出来,存在二维数组里

#include <iostream>

using namespace std;

int a[31][31];

void Caculate()

{

       int i,j;

       a[0][0]=1;

       for(i=1;i<31;i++)

       {

              a[i][0]=a[i][i]=1;

              for(j=1;j<=i;j++)

              {

                     a[i][j]=a[i-1][j-1]+a[i-1][j];

              }

       }

 

}

void Put(int n)

{

       int i,j;

       for(i=0;i<=n;i++)

       {

              for(j=0;j<=i;j++)

              {

                     cout<<a[i][j]<<" ";

              }

              cout<<endl;

 

       }

}

int main()

{

       int input;

       Caculate();

       while(cin>>input,input)

       {

              Put(input);

       }

       return 0;

      

}

魔方阵的排列方法

  如3×3的魔方阵:   8 1 6

 

  3 5 7   4 9 2   魔方阵的排列规律如下:   (1)1放在第一行中间一列;   (2)2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,54的上一行后一列);   (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1   (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;   (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

编辑本段魔方阵的简介

  1.何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既方便,又直观。   2.何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有个小方格,则称这个方阵是一个n阶方阵。   3.何谓魔方阵? 4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1n*n,称此种魔方阵为n阶正规魔方阵。   4.最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背上各负有一图,只有大禹才可指挥其中之由龙马负出的为河图,出自黄河;另一由理龟负出的洛书出自洛河。洛书   5.最早的四阶魔方阵相传是刻在印度一所庙宇石上,年代大约是十一世纪。古代印度人十分崇拜这种幻方,至今从古神殿的遗址,墓碑上常常还可以发现四阶幻方的遗迹。   6.欧洲最早的魔方阵是公元1514年德国画家Albrecht Dure在他著名的铜板画Melencolia上的4×4幻方,有趣的是,他连创造年代(1514)也镶在这个方阵中,而且上下左右,四个小方阵的和皆为34,是欧洲最古老的幻方。

编辑本段魔方阵的变形

  1.相异魔方阵对应方格所填的数字不相同的两个魔方阵,如下图   16 02 03 13 01 15 04 14 05 11 10 08 12 06 09 07 09 07 06 12 13 03 16 02 04 14 15 01 08 10 05 11   2.相等魔方阵每一个对应方格所填的数字都相同的两个魔方阵,如下图4 9 2 4 9 2 3 5 7 3 5 7 8 1 6 8 1 6   3.全等魔方阵若一个魔方阵能够经过旋转或镜射的方式变成和另一个魔方阵相等,称这两个魔方阵全等。在计算魔方阵个数时,我们把全等的魔方阵视为同一种。 2 7 6 8 3 4 9 5 1 1 5 9 4 3 8 6 7 2   4,刚性变形法(1)顺时针方向旋转90 (2)顺时针方向旋转180 (3)顺时针方向旋转270 (4)左右翻转(绕铅直对称轴镜射) (5)上下翻转(绕水平对称轴镜射) (6)左上右下翻转(绕右上至左下对角线镜射) (7)右上左下翻转(绕左上至右下对角线镜射)   原始方阵旋转90。旋转180。旋转270 01 03 16 14 12 08 13 01 07 05 10 12 14 04 09 07 13 15 02 04 10 06 15 03 09 11 06 08 16 02 11 05 08 06 11 09 05 11 02 16 04 02 15 13 03 15 06 10 12 10 05 07 07 09 04 14 14 16 03 01 01 13 08 12   左右翻转上下翻转左上右下翻转右上左下翻转14 16 03 01 12 10 05 07 07 09 04 14 01 13 08 12 04 02 15 13 08 06 11 09 05 11 02 16 03 15 06 10 09 11 06 08 13 15 02 04 10 06 15 03 16 02 11 05 07 05 10 12 01 03 16 14 12 08 13 01 14 04 09 07 5.加值变形法正规魔方阵:首项是1,公差是1加值变形后的魔方阵:首项是a,公差是r   原始魔方首项为5公差为1首项为5公差为2 14 16 03 01 18 20 07 05 31 35 09 05 04 02 15 13 08 06 19 17 11 07 33 29 09 11 06 08 13 15 10 12 21 25 15 19 07 05 10 12 11 09 14 16 17 13 23 27   6.互补变形法就是将魔方阵中的每一个数字都替换成互补数的变形方式。在n阶魔方阵中,数字k的互补数=(1+n*n)–k   原始魔方阵互补变形魔方阵14 16 03 01 03 01 14 16 04 02 15 13 13 15 02 04 09 11 06 08 08 06 11 09 07 05 10 12 10 12 07 05   7.田字变形法以中心点为准将魔方阵分成四个相等的小方阵。当n为奇数时,中央的行列要独立出来。   n是偶数时n是奇数时ABA A1 BDC? D1 E B1 D C1 C将魔方阵如下重组: CD ? C C1 D? BA B1 E D1 B A1 A   可参考下面的范例:原始4阶魔方阵4阶田字变形魔方阵原始5阶魔方阵5阶田字变形魔方阵01 03 16 14 11 09 08 06 18 22 01 10 14 13 17 09 21 05 13 15 02 04 05 07 12 10 04 08 12 16 25 24 03 20 07 11 08 06 11 09 16 14 01 03 15 19 23 02 06 02 06 23 15 19 12 10 05 07 02 04 13 15 21 05 09 13 17 10 14 01 18 22 07 11 20 24 03 16 25 12 04 08 8.井字对换变形法(1)任选一数k1<=k<=n (2)将方阵的第k行和其互补行(n+1-k)对换。 (3)将方阵的第k列和其互补列(n+1-k)对换。 (4)为方便称呼,此时姑且命名为k值井字对换变形。   原始魔方阵1值井字对换魔方阵2值井字对换魔方阵1,2值井字对换魔方阵01 03 16 14 07 10 05 12 01 16 03 14 07 05 10 12 13 15 02 04 04 15 02 13 08 11 06 09 09 11 06 08 08 06 11 09 09 06 11 08 13 02 15 04 04 02 15 13 12 10 05 07 14 03 16 01 12 05 10 07 14 16 03 01 9.拓朴变形法( 1)任选不相等的两数1<=k1,k2<=n,但当(n+1)/2为奇数时,k1k2不能等于(n+1)/2 (2)将座标含k1值的全改成k2。含k2值的全改成k1。含n+1-k1值的全改成n+1-k2。含n+1-k2值的全改成n+1-k1 (3)为方便称呼,此时姑且命名为k1,k2拓朴变形。   可参考下面的313拓朴变形示意图(1,1) (1,2) (1,3) (3,3) (3,2) (3,1) (2,1) (2 ,2) (2,3) (2,3) (2,2) (2,1) (3,1) (3,2) (3,3) (1,3) (1,2) (1 ,1)   可参考下面的范例原始魔方阵1,2拓朴变形魔方阵18 22 01 10 14 08 04 12 25 16 04 08 12 16 25 22 18 01 14 10 15 19 23 02 06 19 15 23 06 02 21 05 09 13 17 11 07 20 03 24 07 11 20 24 03 05 21 09 17 13注:其实对换变形、田字变形可包含于拓朴变形中,只因想法不同故列出参考

编辑本段奇数阶魔方阵的建构法(又称奇数幻方)

  1.杨辉法发明者:杨辉适用:三阶魔方阵方法:九子斜排,上下对易,左右相更,四维挺进   ***1*** **4*2** 4 9 2 *7*5*3* 3 5 7 **8*6** 8 1 6 ***9***   杨辉法推广-菱形法发明者:Bachet de Meziriac适用:奇数阶魔方阵方法:数字斜排,上下对易,左右相更,四维挺进   ********01******** ******06**02****** ? ? ? ****11**07**03*** * 11 24 07 20 03 **16**12**08**04** 04 12 25 08 16 21**17**13**09**05 17 05 13 21 09 **22**18* *14**10** 10 18 01 14 22 ****23**19**15**** ? 23 06 19 02 15 ******24**20****** * *******25********   2.简捷连续填制法发明者:De La Loubere适用:奇数阶魔方阵方法:1立首列中,右一上一,受阻下一   * * 1 * * * * 1 * * * * 1 * * * * 1 * * * * 1 8 * 17 24 1 8 15 * * * * * * * * * * * 5 * * * * 5 * * * * 5 7 * * 23 5 7 14 16 * * * * * * * * * * 4 * * * * 4 6 * * * 4 6 * * * 4 6 13 20 22 * * * * * * * * * * * * * * 3 * * * * 3 10 * * * 3 10 12 19 21 3 * * * * * * * * 2 * * * * 2 * * * * 2 * 11 * * 2 9 11 18 25 2 9简捷连续填制法推广适用:奇数阶魔方阵方法: (1)1立首列中,右11,受阻下1 (2)1立中央上,右12,受阻上2 (3 )1立首行中,右21,受阻右1 (4)1立首列中,右12,受阻下4 (5)1立中央上,右11,受阻上2 (6)1立首行中,左11,受阻右1   3.辅助方阵法适用:五阶以上奇数阶魔方阵方法: (1)制作辅助方阵一:在左上端填入1,按照走马的方式往右二下一的方向填入1至底,接着在每列的1的右边依序填入234…n 1 * * * * 1 2 3 4 5 1 2 3 4 5 * * 1 * * * * 1 * * 4 5 1 2 3 * * * * 1 * * * * 1 2 3 4 5 1 * 1 * * * * 1 * * * 5 1 2 3 4 * * * 1 * * * * 1 * 3 4 5 1 2 (2)制作辅助方阵二:在左上端填入0,按照走马的方式往右一下二的方向填入0至底,接着在每列的0的下面依序填入n2n3n…n(n-1) 0 * * * * 0 15 5 20 10 1 17 8 24 15 * * * 0 * 5 20 10 0 15 9 25 11 2 18 * 0 * * * 10 0 15 5 20 12 3 19 10 21 * * * * 0 15 5 20 10 0 20 6 22 13 4 * * 0 * * 20 10 0 15 5 23 14 5 16 7 (3)将辅助方阵一与二的对应方格内之数相加填到一个新的方阵对应方格内,则新的方阵即为一个魔方阵。   4.扩阶法适用:n阶魔方阵,n为大于5的正整数方法: (1)先建构出一个n-2阶的魔方阵(2)(1)所建立的魔方阵每个数字再加上2n-2 (3)将步骤(2)的魔方阵外面再加上一圈,这一圈有4n-4个空格,填入的数为1~(2n-2)( -2n+3)~n*n,先算出魔术数字会比较好填。   8 1 6 16 09 14 23 01 02 20 19 3 5 7 11 13 15 22 16 09 14 04 4 9 2 12 17 10 05 11 13 15 21 08 12 17 10 18 07 25 24 06 03 5.方阵合成法适用:当魔方阵的阶数n可分解成两个大于2之整数pq的乘积方法:假设A=[(a)ij]B=[(b)ij]分别代表m阶与n阶魔方阵,对每个t=12…m*m,令At=[(a)ij+m*m(t–1)]。接着我们将方阵B中的数tm阶魔方阵(A)t代替,就可以得到一个m n阶魔方阵。   可参考下面的范例魔方阵A魔方阵B 35 28 33 26 19 24 71 64 69 8 1 6 4 3 8 30 32 34 21 23 25 66 68 70 3 5 7 9 5 1 31 36 29 22 27 20 67 72 65 4 9 2 2 7 6 80 73 78 44 37 42 08 01 06 75 77 79 39 41 43 03 05 07 A4 A3 A8 76 81 74 40 45 38 04 09 02 A9 A5 A1 17 10 15 62 55 60 53 46 51 A2 A7 A6 12 14 16 57 59 61 48 50 52 13 18 11 58 63 56 49 54 47

编辑本段偶数阶魔方阵的建构法

  1、杨辉法发明者:杨辉适用:4阶魔方阵方法:以十六子,依次递作四行排列,先以外四子对换,一换十六、四换十三,以四内角对换,六换十一、七换十,横直上下斜角,皆三十四数,对换止可施之于小。   01 02 03 04 16 02 03 13 16 02 03 13 05 06 07 08 05 06 07 08 05 11 10 08 09 10 11 12 09 10 11 12 09 07 06 12 13 14 15 16 04 14 15 01 04 14 15 01   杨辉法推广-消去对角线法适用:四之倍数阶魔方阵方法: (1)先将整个方阵划分成k*k4阶方阵,然后在每个4阶方阵的对角线上做记号( 2)由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1 (3)自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1   2.井字法适用:四之倍数阶魔方阵方法: (1)1~n*n从左上角依序填入方阵内(2)用两条铅直线和两条水平线将方阵分隔成四个角落各有一个n/4阶的子方阵,和中心位置有一个n/2阶的子方阵(3)以方阵中心为对称点,将五个子方阵的数字作对称交换,其它的数字不要动。这样的方阵会是一个魔方阵   01 02 03 04 16 02 03 13 05 06 07 08 05 06 07 08 09 10 11 12 09 10 11 12 13 14 15 16 04 14 15 01   3.辅助方阵法适用:偶数阶魔方阵(因非四的倍数作法相当复杂,在此只介绍四的倍数的作法)方法: (1)制作辅助方阵一:第一列由左向右排列1n,第二列由右向左排列1n,第三列同第二列,第四列同第一列,若超过四列,重复一至四列的作法,完成辅助方阵一(2)制作辅助方阵二:将第一个辅助方阵各方格内的数字x换成n(x-1),再做行列互换,完成辅助方阵二(3)将辅助方阵一与二的对应方格内之数相加填到一个新的方阵对应方格内,则新的方阵即为一个魔方阵01 02 03 04 00 12 12 00 01 14 15 04 04 03 02 01 04 08 08 04 08 11 10 05 04 03 02 01 08 04 04 08 12 07 06 09 01 02 03 04 12 00 00 12 13 02 03 16   4.扩阶法同奇数阶之作法   5.方阵合成法同奇数阶之作法

编辑本段C语言程序求魔方阵如下:(求奇数幻方)

代码一:   #include <stdio.h>   #define N 16 //这里可以修改N的值   int main()   {   int a[N][N]={0},i,j,k,p,m,n;   p=1;   while(p==1)   {   printf("Enter n(1~%d): ",N-1);/*可以输入小于等于N-1的整数*/   scanf("%d",&n);   if((n!=0)&&(n<N)&&(n%2!=0)) p=0;   }   i=n+1;   j=n/2+1; /*建立魔方阵*/   a[1][j]=1;   for(k=2;k<=n*n;k++)   {   i=i-1;   j=j+1;   if((i<1)&&(j>n))   {   i=i+2;j=j-1;   }   else   {   if(i<1) i=n;   if(j>n) j=1;   }   if(a[i][j]==0) a[i][j]=k;   else   {   i=i+2;   j=j-1;   a[i][j]=k;   }   }   for(i=1;i<=n;i++)/*输出魔方阵*/   {   for(j=1;j<=n;j++)   printf("%4d",a[i][j]);   }   printf("/n");   }   代码二:(相对于代码一条理更清晰,更简单、更容易理解)   将1n的平方这几个数构成一个n阶魔方阵。   算法:   依以下法则,你可以很快的写出奇数阶幻方!当然,这种写法只是其中一个答案,而不是唯一答案。   1)将1填入第一行中间;   2)将每个数填在前一个数的右上方。   3)若该位置超出最上行,则改填在最下行的对应位置;   4)若该位置超出最右列,则该填在最左列的对应行位置;   5)若某元素填在第一行最右列,下一个数填在该数同列的下一行;   6)若某数已填好,但其右上角已填了其他数据,则下一个数填在该数同列的下一行位置。   #include<stdio.h>   void main()   {   int a[15][15]={0},i,j,m,n,temp,M;   printf("请输入一个3~15的奇数:/n");   scanf("%d",&M);   i=0;   j=M/2;   a[i][j]=1;   for(temp=2;temp<=M*M;temp++)   {   m=i;   n=j;   i--;   j++;   if(i<0)   i=M-1;   if(j>M-1)   j=0;   if(a[i][j]!=0)   i=m+1,j=n;   a[i][j]=temp;   }   printf("%d×%d魔方阵:/n",M,M);   for(i=0;i<M;i++)   {   for(j=0;j<M;j++)   printf("%4d",a[i][j]);   printf("/n");   }   }   //(求4的倍数阶幻方)   void main()   {   int i,j,x,y,n,t,k=1;   int a[100][100];   printf("请输入魔方阵的阶数 n /n");   scanf("%d",&n);   printf("输出为:/n");   if(n%4==0)   {   for(i=0;i<n;i++)   for(j=0;j<n;j++)   {   a[i][j]=k;   k++;   }   x=n-1;   for(j=0;j<n/2;j++,x--)   {   for(i=0;i<n;i++)   if(i%4!=j%4&&(i+j)%4!=3)   {   t=a[i][j];   a[i][j]=a[i][x];   a[i][x]=t;   }   }   x=n-1;   for(i=0;i<n/2;i++,x--)   {   for(j=0;j<n;j++)   if(i%4!=j%4&&(i+j)%4!=3)   {   t=a[i][j];   a[i][j]=a[x][j];   a[x][j]=t;   }   }   for(i=0;i<n;i++)   {   for(j=0;j<n;j++)   printf("%-4d",a[i][j]);   printf("/n");   }   }   else printf("输入错误/n");   system("pause...");   }

代码:

 

#include <iostream>

using namespace std;

int a[16][16];

int main()

{

       int n,ii;

       int x=0,y=0;

       cout<<"输入n:(0<n<16,n为奇数)"<<endl;

       cin>>n;

while(n>15||n<=0||n%2==0)

{

       cout<<"输入n:(0<n<16,n为奇数)"<<endl;

       cin>>n;

}

memset(a[16],0,sizeof(a[16]));

int t=n/2;

a[0][t]=1;

int i=0;

int j=t;

for(ii=2;ii<=n*n;ii++)

{

       if(i==0)

              x=n-1;

       else x=i-1;

       if(j==n-1)

              y=0;

       else

              y=j+1;

       if(a[x][y]!=0)

             

       {

              x=i+1;

           y=j;

              a[x][y]=ii;

       }

      

       else

              a[x][y]=ii;

       i=x;

       j=y;

}

for(i=0;i<n;i++)

{

       for(j=0;j<n;j++)

              cout<<a[i][j]<<" ";

       cout<<endl;

}

return 0;

 

 

 

}

参考代码:

#include <stdio.h>

#include <math.h>

void main()

{

    int a[16][16],i,j,n,k;

    printf("Please input  n(1~15,it must be odd.): ");

    scanf("%d",&n);

    while(!(n>=1&&n<=15)||n%2==0)

    {

        printf("The number is invalid.Please insert again:");

        scanf("%d",&n);

    }

    for(i=1;i<=n;i++)

        for(j=1;j<=n;j++)

            a[i][j]=0;

    j=n/2+1;

    a[1][j]=1;

    i=1;

    for(k=2;k<=n*n;k++)

    {

         i=i-1;j=j+1;

    if(i==0&&j==n+1)

    {

    i=i+2;j=j-1;

    }

    else

    {

        if(i==0)

        {

            i=n;

        }

        if(j==n+1)

        {

              j=1;

        }

    }

    if(a[i][j]==0)

    {

        a[i][j]=k;

    }

    else

    {

        i=i+2;

        j=j-1;

        a[i][j]=k;

    }

  }

  for(i=1;i<=n;i++)

  {

    for(j=1;j<=n;j++)

        printf("%3d",a[i][j]);

    printf("/n");

  }

}

 

 

 

 

 

 

 

 

做题感悟:

 按照原来的思路解决遇见的问题时,如果我花费的时间超过一刻钟时,则转换解题思路。快速解题

 

#include <cstdio>

#include <cstring>

using namespace std;

const int direction[4][2]={{-1,0},{0,-1},{0,1},{1,0}};

char map[100][101];

int row;

int col;

int bfs(int r,int c)

{

       int counter=0;

       if('p' == map[r][c])++counter;

       map[r][c]='#';

       for(int d=0;d<row;++d)

       {

              int dr=r+direction[d][0];

              int dc=c+direction[d][1];

              if(dr>=0 && dr<row && dc>=0 && dc<col && map[dr][dc]!='#')

              {

                     counter += bfs(dr,dc);

              }

       }

       return counter;

}

int main()

{

       while(scanf("%d%d",&row,&col),row!=0 && col!=0)

       {

              for(int i=0;i<row;++i)

              {

                     scanf("%s",map[i]);

              }

              int counter=0;

              for(int i=0;i<row;++i)

              {

                     for(int k=0;k<col;++k)

                     {

                            if(map[i][k]=='d')

                            {

                                   counter += bfs(i,k);

                            }

                     }

              }

              printf("%d/n",counter);

       }

       return 0;

}

/*

4 7

#p.d#p#

#####.#

d.....#

######p

4 7

#p.d#d#

#####.#

d...p##

######p

4 7

#p.d#d#

#####.#

d...p.#

######p

4 7

#p.d#d#

#####.#

d...pp#

######p

4 7

#p.d#d#

#######

d...pp#

######p

4 7

#p.d#d#

#######

ddddpp#

######p

*/

 

 

#include <stdio.h>

#include <string>

#include <iostream>

#include <deque>

using namespace std;

/*

char src[1000]={0};

char de[1000]={0};

 

int main()

{

       int n = 0;

       int a = 0,b = 0,c = 0;

       int i = 0,j = 0,k = 0;

       scanf("%d",&n);

       getchar();

       while(n--)

       {

              while(EOF != (src[i++] =getchar()))

                     ;

              src[i-1] = '/0';

              i = 0;            

              while(EOF != (de[i++] =getchar()))

                     ;

              de[i-1] = '/0';

              char *s = src;

              char *d = de;

              bool iswrong = false;

              for(i = 0,j = 0;i<strlen(src);)

              {

                     if(d[j] != ' ' &&

                            d[j] != '/n' &&

                            s[i] != ' ' &&

                            s[i] != '/n'&&

                            s[i] != d[j])

                     {

                            printf("WA/n");

                            iswrong = true;

                            break;

                     }

                     else if(d[j] != ' ' &&

                            d[j] != '/n' &&

                            s[i] != d[j] &&

                            (s[i] == ' ' || s[i] == '/n')

                            )

                     {

                            i++;

                     }

                     else if(s[i] == d[j])

                     {

                            i++;j++;

                     }

              }

              if(!iswrong)

              {

                     if(i == j)

                            printf("AC/n");

                     else

                            printf("PE/n");

              }

 

       }

       return 0;

}

*/

 

/*

hello world

hello  world

*/

/*

*/

 

/*

4 7

#p.d#p#

#####.#

d.....#

######p

*/

 

struct Thing

{

       int worth;

       int cost;

};

Thing a[100] = {0};

int res[100][100] = {0};

int num[100][100] = {0};

 

int main()

{

       int i,j,k = 0,n;

       scanf("%d",&n);

       getchar();

       while(n--)

       {           

              int sumthing,sumv;

              scanf("%d %d",&sumthing,&sumv);

 

              for(i = 1;i<=sumthing;i++)

                     scanf("%d %d",&a[i].worth,&a[i].cost);

 

           for(i = 0;i<=sumthing;i++)

                     num[i][0] = res[i][0] = 0;

              for(i = 0;i<=sumv;i++)

                     num[0][i] = res[0][i] = 0;

              for(i = 1;i<=sumthing;i++)

              {

                     for(j = 1;j<=sumv;j++)

                     {

                            if(j-a[i].cost >= 0)

                            {

                                   if(res[i-1][j] < res[i-1][j-a[i].cost]+a[i].worth)

                                   {

                                          res[i][j] = res[i-1][j-a[i].cost]+a[i].worth;

                                          num[i][j] = num[i-1][j-a[i].cost] + 1;

                                   }

                                   else if(res[i-1][j] == res[i-1][j-a[i].cost]+a[i].worth)

                                   {

                                          res[i][j] = res[i-1][j];

                                          if(num[i-1][j] > num[i-1][j-a[i].cost]+1)

                                          {

                                                 num[i][j] = num[i-1][j-a[i].cost]+1;

                                          }

                                          else

                                                 num[i][j] = num[i-1][j];

                                   }

                                   else

                                   {

                                          res[i][j] = res[i-1][j];

                                          num[i][j] = num[i-1][j];

                                   }

                            }

                            else

                            {

                                   res[i][j] = res[i-1][j];

                                   num[i][j] = num[i-1][j];

                            }

                     }

              }

              printf("%d %d/n",res[sumthing][sumv],num[sumthing][sumv]);

       }

       return 0;

}

 

/*

2

3 5

4 2

6 3

10 5

3 5

2 3

3 3

5 5

*/

#include <iostream>

#include <queue>

#include <string>

using namespace std;

//玉树救援队

char maze[101][101];//二维地图

int mark[101][101];//标记函数

int dri[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//dog搜索方向上下左右

int r,c;//行数、列数

int dfs(int dr,int dc)

{

       int cc=0;

       queue<int>p; //单向队列,常用函数有push(),pop(),back(),front(),empty(),size()

                    //双端队列deque,常用函数有push_back(),pop_front(),push_front(),insert(p.begin()+X,n),::iterator it,begin(),end()

                   //reverse_iterator rit,rbegin(),rend(),

       p.push(dr);

       p.push(dc);

       mark[dr][dc]=1;

       while(!p.empty())

       {

              int i=p.front();

              p.pop();

              int j=p.front();

              p.pop();

              if(maze[i][j]=='p')

              {

                     cc++;//找到受灾人,cc自动加1

              }

              for(int di=0;di<4;di++)

              {

                     int dx=i+dri[di][0];

                     int dy=j+dri[di][1];

                     if(dx>=0&&dx<r&&dy>=0&&dy<c)

 

                     {

                            if(mark[dx][dy]==0&&maze[dx][dy]!='#')

                            {

                                   mark[dx][dy]=1;

                                   p.push(dx);

                                   p.push(dy);

                            }

                     }

              }

             

 

             

       }

       return cc;

 

}

int main()

{

       int i,j,n,m;

       while(1)

       {

              int count=0;

              scanf("%d%d",&r,&c);

              if(r+c==0) break;

              getchar();

              for(n=0;n<r;n++)

              {

                     gets(maze[n]);

              }

              for(n=0;n<r;n++)

              {

                     for(m=0;m<c;m++)

                     {

                            if(maze[n][m]=='d')

                            {

                                  

                            count+=dfs(n,m);

                            memset(mark,0,sizeof(mark));//对标记矩阵复原0

                            }

                           

                     }

              }

         

           cout<<count<<endl;

 

 

             

       }

       return 0;

}

 

 

/*

4 7

#p.d#p#

#####.#

d.....#

######p

4 7

#p.d#p#

#####.#

d.....#

#####.p

4 7

#p.d#p#

#####.#

d....##

######p

*/

#include <iostream>

#include <deque>

using namespace std;

char maze[101][101];

int mark[101][101];

int dri[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int r,c;

int dfs(int dr,int dc)

{

       int cc=0;

       deque<int>p;

       p.push_back(dr);

       p.push_back(dc);

       while(!p.empty())

       {

              int i=p.front();

              p.pop_front();

              int j=p.front();

              p.pop_front();

              mark[i][j]=1;

              if(maze[i][j]=='p')

              {

                     cc++;

              }

              for(int di=0;di<4;di++)

              {

                     int dx=i+dri[di][0];

                     int dy=j+dri[di][1];

                     if(dx>=0&&dx<r&&dy>=0&&dy<c)

 

                     {

                            if(mark[dx][dy]==0&&maze[dx][dy]!='#')

                            {

                                   p.push_back(dx);

                                   p.push_back(dy);

                            }

                     }

              }

             

 

             

       }

       return cc;

 

}

int main()

{

       int i,j,n,m;

       deque<int>d;

       while(1)

       {

              int count=0;

              scanf("%d%d",&r,&c);

              if(r+c==0) break;

              getchar();

              for(n=0;n<r;n++)

              {

                     gets(maze[n]);

                            for(m=0;m<c;m++)

                            {

                                   if(maze[n][m]=='d')

                                   {

                                  

                                          d.push_back(n);

                                          d.push_back(m);

 

                                   }

 

                            }

              }

           while(!d.empty())

              {

                     i=d.front();

                     d.pop_front();

                     j=d.front();

                     d.pop_front();

                     count+=dfs(i,j);

                     memset(mark,0,sizeof(mark));

 

              }

           cout<<count<<endl;

 

 

             

       }

       return 0;

}

/*

4 7

#p.d#p#

#####.#

d.....#

######p

4 7

#p.d#p#

#####.#

d.....#

#####.p

4 7

#p.d#p#

#####.#

d....##

######p

*/

//来自网络feil的生日礼物输出阶乘结果最后一位

//利用阶乘大数思想

const int MAX=100;

int main()

{

       unsigned int a[MAX];

       memset(a,0,sizeof(a));

       int n,i,j,m;

       int dig=1,p=1;

       a[0]=1;

       a[1]=1;

       cin>>n;

       for(i=1;i<=n;i++)

       {

              for(j=1;j<=dig;j++)

              {

                     a[j]*=i;

              }

              for(m=1;m<=dig;m++)

                            {

                                   if(a[m]>=10)

                                   {

                            //     a[m+1]+=a[m]/10;

                                   a[m]=a[m]%10;

                                   p=m+1;

                               if(a[m]==0) break;

                                   }

                                  

                            }

              if(p>dig) dig=p;

      

       };

 

 

             

       cout<<i-1<<"最后一位:";

       cout<<a[1]<<endl;

       cin.get();

       return 0;

}

 

//数学计算

int main()

{

       long n,dam,c,m;

       while(scanf("%ld",&n)!=EOF)

       {

              long da=1,i=1;//局部变量

              dam=1;//全局变量

       while(i<=n)

       {

              m=dam*i;

              da=m%10;

              if(da==0) break;

              dam=m;

              i++;

             

       }

       cout<<da<<endl;

       }

       return 0;

}

//功能给出年月日,输出星期几

int Weekday(int N,int M,int D)

{

       int c,y,w,m,n;

       m=(M-2)%12;

       if(M>=3)

       {

              n=N;

       }

       else

              n=N-1;

       c=n/100;

       y=n%100;

       w=(int)(D+floor(13*m/5)+y+floor(y/4)+floor(c/4)-2*c)%7;

       while(w<0) w+=7;

       return w;

}

int main()

{

 

        int m=Weekday(2011,5,28);

        switch(m)

        {

        case 0 :cout<<"星期日"<<endl;break;

        case 1 :cout<<"星期1"<<endl;break;

        case 2 :cout<<"星期2"<<endl;break;

        case 3 :cout<<"星期3"<<endl;break;

        case 4 :cout<<"星期4"<<endl;break;

        case 5 :cout<<"星期5"<<endl;break;

        case 6 :cout<<"星期6"<<endl;break;

        }

 

        

       return 0;

      

}

 

template<class _BI> inline

       bool next_permutation(_BI _F, _BI _L)

       {_BI _I = _L;

       if (_F == _L || _F == --_I)

              return (false);

       for (; ; )

              {_BI _Ip = _I;

              if (*--_I < *_Ip)

                     {_BI _J = _L;

                     for (; !(*_I < *--_J); )

                            ;

                     iter_swap(_I, _J);

                     reverse(_Ip, _L);

                     return (true); }

              if (_I == _F)

                     {reverse(_F, _L);

                     return (false); }}}

              // TEMPLATE FUNCTION next_permutation WITH PRED

template<class _BI, class _Pr> inline

       bool next_permutation(_BI _F, _BI _L, _Pr _P)

       {_BI _I = _L;

       if (_F == _L || _F == --_I)

              return (false);

       for (; ; )

              {_BI _Ip = _I;

              if (_P(*--_I, *_Ip))

                     {_BI _J = _L;

                     for (; !_P(*_I, *--_J); )

                            ;

                     iter_swap(_I, _J);

                     reverse(_Ip, _L);

                     return (true); }

              if (_I == _F)

                     {reverse(_F, _L);

                     return (false); }}}

              // TEMPLATE FUNCTION prev_permutation

template<class _BI> inline

       bool prev_permutation(_BI _F, _BI _L)

       {_BI _I = _L;

       if (_F == _L || _F == --_I)

              return (false);

       for (; ; )

              {_BI _Ip = _I;

              if (!(*--_I < *_Ip))

                     {_BI _J = _L;

                     for (; *_I < *--_J; )

                            ;

                     iter_swap(_I, _J);

                     reverse(_Ip, _L);

                     return (true); }

              if (_I == _F)

                     {reverse(_F, _L);

                     return (false); }}}

              // TEMPLATE FUNCTION prev_permutation WITH PRED

template<class _BI, class _Pr> inline

       bool prev_permutation(_BI _F, _BI _L, _Pr _P)

       {_BI _I = _L;

       if (_F == _L || _F == --_I)

              return (false);

       for (; ; )

              {_BI _Ip = _I;

              if (!_P(*--_I, *_Ip))

                     {_BI _J = _L;

                     for (; _P(*_I, *--_J); )

                            ;

                     iter_swap(_I, _J);

                     reverse(_Ip, _L);

                     return (true); }

              if (_I == _F)

                     {reverse(_F, _L);

                     return (false); }}}

_STD_END

#ifdef  _MSC_VER

#pragma pack(pop)

#endif  /* _MSC_VER */

 

#endif /* _ALGORITHM_ */

#include <iostream>

#include <vector>

#include <string>

#include <fstream>

#include <algorithm>

#include <numeric>

#include <math.h>

using namespace std;

 

/*

// 求集合的子集

//

// CopyRight (C) 内蒙古科技大学信息工程学院ACM程序设计协会 2009 - 2010 凝霜(马冬亮)

 

#include <iostream>

 

using namespace std;

 

enum

{

    SizeOfList = 4,

    NotFound = -1

};

 

void display(char buffer[], char bufferLength)

{

    static bool isFirst = true;

 

    if (isFirst)

    {

        isFirst = false;

        cout << "{}" << endl;

    }

 

    cout << "{";

 

    for (int i = 0; i < bufferLength; ++i)

    {

        cout << buffer[i];

    }

 

    cout << "}" << endl;

}

 

int findIndex(char list[], char elem)//返回元素所在下表

{

    for (int i = 0; i < SizeOfList; ++i)

    {

        if (elem == list[i])

        {

            return i;

        }

    }

 

    return NotFound;

}

 

void subSet(char list[], int select, char buffer[], int bufferLength)

{

    if (SizeOfList > select)

    {

        for (int i = (0 == bufferLength) ? 0 : findIndex(list, buffer[bufferLength - 1]) + 1;

            i < SizeOfList; ++i)

        {

            buffer[bufferLength] = list[i];

            display(buffer, bufferLength + 1);

            subSet(list, select + 1, buffer, bufferLength + 1);

        }

    }

}

 

int main()

{

    char list[SizeOfList] = {'a', 'b', 'c', 'd'};

    char buffer[SizeOfList] = {' ', ' ', ' ', ' '};

 

    subSet(list, 0, buffer, 0);

 

    system("pause");

 

    return 0;  

}

 

#if 0   // 输出

{}

{a}

{ab}

{abc}

{abcd}

{abd}

{ac}

{acd}

{ad}

{b}

{bc}

{bcd}

{bd}

{c}

{cd}

{d}

#endif

*/

int main()

{

  int i;

  int A[]={0,1,2,3};

  while(next_permutation(A,A+4)==true)

  {

         for(i=0;i<4;i++)

                cout<<A[i]<<" ";

         cout<<endl;

  }

  return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值