金字塔和吊絲的逆襲(水題)

一.目的

好久沒寫博客了,都不會寫了,今天有那麼刷題時,學習到了一些好的思路,給大家分享一下。

## 題目大意 ##

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;
}
發佈了27 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章