三角形的输入输出问题,我想到了二维数组,在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:二维数组回形遍历
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的时候,这个时候就比较麻烦了,不过能看明白的,有套路的不都是水题吗,,暂不叙述,,