一.目的
好久没写博客了,都不会写了,今天有那么刷题时,学习到了一些好的思路,给大家分享一下。
## 题目大意 ##
1.屌丝的逆袭
http://www.codevs.cn/problem/1400/
2.金字塔
http://codevs.cn/problem/1438/
二.解题思路
1.屌丝的逆袭:
因为该题要求前后左右人的魅力值总和最大的那个人的位置,该题给了范围,第一种思路就是你要考虑最左边,最右边,最上边和最下边的情况,因为这些都是特殊的位置,这样程序会很复杂。
另一种思路的解决方法,就是定义一个22*22的二维数组,给它初始化为0,并且让数组的i,j都从1开始到你输入的最大行列为止,这样相当于一个同心矩阵,最外一层是0,你所操作的是内层,这样你就不用考虑边界的情况,因为边界都是0。
>
2.代码
/*吊丝的逆袭*/
# include <stdio.h>
#define INEF 9999999
int main(void)
{
int n,i,j,sum=0, m,k,l;
int a[22][22]= {0};
int max = -INEF;//因为要求最大的值,先初始化最小
while(scanf("%d%d",&m, &n))
{
if(n==0 && m == 0)
break;
for(i = 1; i<=m; i++)
{
for(j = 1; j<=n; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i = 1; i<=m; i++)
{
for(j = 1; j<=n; j++)
{
if(a[i][j] > 0) sum = -a[i-1][j]-a[i+1][j]-a[i][j-1]-a[i][j+1];//性别不同相加绝对值,性别相同减去,
if(a[i][j] < 0) sum = a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1];//所以全加的效果都一样
if(sum > max)
{ max = sum;
k = i;
l = j;
}
}
}
printf("%d %d %d\n",k,l,max);
}
return 0;
}
3.金字塔
因为题目的要求是金字塔的两边对称,也可以用一个二位数组来解决,数组的行是你输入的数字,数组的列是你输入数字的二倍,然后给数组全都初始化为空格,然后从中间位置开始填充金字塔。
用一个变量来保存要输入下滑线的个数,在用一个变量来保存你每一行要填坑的最初位置,具体看代码。
4.代码
# include <stdio.h>
int main(void)
{
int n;
scanf("%d",&n);
int sum = n*2;
char a[n][sum];
for(int i = 0; i<n; i++)
{
for(int j = 0; j<sum; j++)
{
a[i][j] = ' ';
}
}
int t = 0;//记录下划线的个数
int j = n;//来记录填坑的最初位置
for(int i = 0; i<n; i++)
{
j-=1;
a[i][j] = '/';
for(int k = j+1; k<t+j+1; k++)
{
a[i][k] = '_';
}
a[i][t+j+1] = '\\';//输出反斜杠用这样
t+=2;
}
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n*2; j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
return 0;
}