一.目的
好久沒寫博客了,都不會寫了,今天有那麼刷題時,學習到了一些好的思路,給大家分享一下。
## 題目大意 ##
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;
}