从难到易给几题的题解,一些水题就不打了。
最后一题:
20 数字三角形3
基本思路:
其实它的赋值位置是一个循环,什么样的循环呢?
先从最后一排从前往后铺路,再从最后一列从下往上铺路,最后一个“下楼梯”回到倒数第二行。完成一次循环,下一个循环就从刚刚停下来的地方往前继续。
如图,1->12就是一个三角循环。然后13开始再来一个这样的。
那什么时候结束呢?会发现,终止的数字和输入的n是有关系的。看上面的图,从第一列开始数每列数字,1+2+3+4+5(n),等等,这不就是前n项和吗?所以,我们的终止条件就是这个数增加到了(1+n)*n/2。
每次循环的开始及结束位置和你的循环次数有关,这里就留下点思考空间了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i , j;
int n;
scanf("%d",&n);
int a[50][50];
memset(a,-1,sizeof(a)); int flag=0;
int tot=1; int count=0;
while(n)
{
for(j=0+count*2;j<=n-1-count*1;j++)
{
a[n-1-count][j]=tot;
if(tot==((1+n)*n/2)) {flag=1; break;}
tot++;
}
if(flag) break;
for(i=n-2-count;i>=0+count*2;i--)
{
a[i][n-1-count]=tot;
if(tot==((1+n)*n/2)) {flag=1; break;}
tot++;
}
if(flag) break;
for(i=1+count*2,j=n-2-count;i<=n-2-count;i++,j--)
{
a[i][j]=tot;
if(tot==((1+n)*n/2)) {flag=1; break;}
tot++;
}
if(flag) break;
count++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==-1)
printf("%5c",' ');
else
printf("%5d",a[i][j]);
if(j==n-1) printf("\n");
}
}
}
2.
19 菱形旋转
这个题目有几个坑点要注意,第一个是读入字符时候,它会多读一个n后面的回车,这时候要先读一个回车抵消掉。
然后第二个就是不要以为读进来题目数据就完了,我们毕竟要旋转矩阵,旋转的过程其实就是元素交换的过程,那么我要保证不越界,那么就确保矩阵是一个以最大长长为边的矩阵。比如输入5我就要用到5*5的矩阵。所以读入数据的时候,要把每行后面铺满空格。
#include <stdio.h>
#include <stdlib.h>
char a[20][20]={{0}};
char b[20][20]={{0}};
int main()
{
int i,j,n,w,t;
scanf("%d", &n);
char s; j=0;
s=getchar(); //抵消回车
for(i=0;i<n;i++)
{
while((s=getchar())!='\n')
{
if(s==' ') a[i][j++]=32;
else a[i][j++]=s;}
// printf("%c",s);
int k;
for(k=j;k<n;k++)
a[i][k]=32;
j=0;
}
scanf("%d", &w);
w=(w%360)/90;
for(t=0; t<w; t++)
{
/********please correct here**************
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
b[i][j]=a[j][i];
***************************************/
int l;
for(i = 0; i < n; i ++)
{
for(l = n - 1;l >= 0; l --)
b[i][n-1-l]=a[l][i];
// printf("\n");
}
for(i = 0; i < n; ++i)
for(j = 0; j < n; j++)
a[i][j] = b[i][j];
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
if(a[i][j]<32)
printf(" ");
else
printf("%c", a[i][j]);
printf("\n");
}
return 0;
}