九度oj 专题整理(模拟部分3)

来源:互联网 发布:极简主义 知乎 编辑:程序博客网 时间:2024/06/06 06:43

三角形的输入输出问题,我想到了二维数组,在POJ上练习题目的过程中,发现北大对二维数组的考察也是蛮多的,感觉也很有趣,于是学习了几个题目,因为写不出代码,也只能说学习了,简单做一下整理,如果以后有机会,会完善这部分= =

20:反反复复

第一次遇上没做出来,心情很不好的说= =点击打开链接,以下是网上代码,因为是从我的AC代码中粘过来的,所以就不附原来的博客链接了 = =见谅
#include <iostream>  #include <string>    using namespace std;    const int M = 20;  const int N = 100;  char A[N][M], B[N][M];    int main()   {      string s;      int m, n, t=0, r=-1;      cin >> m;      cin >> s;      while (t < s.length())//一次读入字符到二维数组       {          r++;          for (int j=0; j<m; j++)              A[r][j] = s[t++];          if (t < s.length())          {              r++;              for (int j=m-1; j>=0; j--)                  A[r][j] = s[t++];          }      }      n = s.length() / m; //行数       for (int j=0; j<m; j++)//从上到下逐行输出字符       {          for (int i=0; i<n; i++)          {              cout << A[i][j];          }      }      cout << endl;            return 0;     }   

以下是我的代码,WA了,也许是字符数组太多,搞的哪里有点乱,可是想了很久也不知道哪里错了,如果有大神看了,请指出,不胜感激
#include <stdio.h>#include <stdlib.h>#include <algorithm>#include <iostream>#include <string.h>#include <queue>#include <vector>using namespace std;int main(){    char str[2200];    char ma[40][42];    char map[42][42];    int n;    scanf("%d",&n);    //getchar();    cin>>str;    //scanf("%s",str);    int len=strlen(str);    memset(map,'\0',sizeof(map));    int k=0;    int m=len/n;    for(int i=0; i<m; i++)    {        for(int j=0; j<n; j++)        {            ma[i][j]=str[k++];        }    }    for(int i=0; i<m; i++)    {        int p=0;        if(i%2==1)        {            for(int j=n-1; j>=0; j--)            {                map[i][p++]=ma[i][j];            }        }        else        {            for(int j=n-1; j>=0; j--)            {                map[i][j]=ma[i][j];            }        }    }    for(int j=0; j<n; j++)    {        for(int i=0; i<m; i++)        {            printf("%c",map[i][j]);        }       // printf("\n");    }    printf("\n");    return 0;}

神奇的幻方点击打开链接
这个题目描述的很清楚,但是自己写的时候真是状况百出,四个方向i,j的加减不对应,改了好久= =
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#define exp 1e-6#define pi acos(-1.0)using namespace std;int main(){    int n;    int ma[40][40];    while(~scanf("%d",&n))    {        memset(ma,0,sizeof(ma));        int m=2*n-1;        int sum=1;        int cnt=m*m;        int i=1,j=n;        while(sum<=cnt)        {            ma[i][j]=sum++;            //printf("%d %d %d\n",i,j,ma[i][j]);            if(i==1&&j<m)            {                i=m;                j++;            }            else if(j==m&&i>1)            {                i--;                j=1;            }            else if(i==1&&j==m||ma[i-1][j+1]!=0)            {                i++;            }            else            {                i--;                j++;            }            //ma[i][j]=sum++;            //printf()        }        for(int x=1;x<=m; x++)        {            for(int y=1; y<m; y++)            {                printf("%d ",ma[x][y]);            }            printf("%d\n",ma[x][m]);        }    }    return 0;}


23:二维数组回形遍历


题目点击打开链接这个题目感谢一篇优秀的博客点击打开链接,不过我只是稍加改动,就样例正确,但是TLE了,代码就不贴了

24:蛇形填充数组


题目点击打开链接也是借鉴的其他博客,感觉写的很好,我写着写着就感觉乱,大概是对while循环掌握的还不好吧
#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<set>#include<map>#define LL long long#define PI acos(-1)#define exp 1e-9#define INF 0x7ffffff;using namespace std;int a[10][10];int n;int prin(int e)//c{    for(int i=1; i<=e; i++) {        for(int j=1; j<=e; j++)            cout<<a[i][j]<<' ';        cout<<endl;    }    return 0;}int main(){    cin>>n;    int x=1,i=1,j=1,m=1;    while(m<=n) {        a[i][j]=x;        if(j<n) j++;        else if(j==n) i++;        x++;        while(i<n&&j>1) {            a[i][j]=x;            i++;            j--;            x++;        }        a[i][j]=x;        if(i<n) i++;        else if(i==n) j++;        x++;        while(i>1&&j<n) {            a[i][j]=x;            i--;            j++;            x++;        }        m++;    }    prin(n);    return 0;}

类似的题目还有,比如当m!=n的时候,这个时候就比较麻烦了,不过能看明白的,有套路的不都是水题吗,,暂不叙述,,