1. 程式人生 > >九度oj 專題整理(模擬部分3)

九度oj 專題整理(模擬部分3)

三角形的輸入輸出問題,我想到了二維陣列,在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的時候,這個時候就比較麻煩了,不過能看明白的,有套路的不都是水題嗎,,暫不敘述,,