九度oj 專題整理(模擬部分3)
阿新 • • 發佈:2018-12-04
三角形的輸入輸出問題,我想到了二維陣列,在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的時候,這個時候就比較麻煩了,不過能看明白的,有套路的不都是水題嗎,,暫不敘述,,