0

次のようなグリッドがあります。 ここに画像の説明を入力

私のプログラムが行うことは、バッジが獲得されたかどうかを計算し、バッジが獲得されたかどうかを特定の入力 (入力は座標 (x、 y)))。しかし、何らかの理由で、出力を印刷しようとすると、私のプログラムは黄色の網掛け部分のみを計算しています。

私のコードでは、次のように言って、端にないボックスを説明しました。

if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19))

しかし、これは私の問題を解決していないようです。注: 入力 (x, y) が区間 [1, 20] にない場合、-1 を返します。

結果を印刷すると、次のようになります。 ここに画像の説明を入力

ご覧のとおり、エッジにないフィールドのシルバー バッジの出力は表示されません。端にないボックスが計算/印刷されない理由がわかりません。

注:フィールドが 2 つ以上のブロンズ バッジを獲得した場合、Poly バッジは「はい」を返します。

注: Any Color バッジは、次の場合にバッジを返します。

  1. フィールドは 0 個のブロンズ バッジを獲得し、隣接するすべてのフィールドがブロンズ バッジを獲得しない場合 (隣接するフィールドには北西、北東、南西、南東が含まれます)

  2. フィールドは 1 つのブロンズ バッジを獲得し、フィールド全体のスコア (fieldScore として宣言) は 20 以上です。

  3. 畑は 2 つのブロンズ バッジを獲得し、次の少なくとも 1 つに該当します: 畑が利益をもたらさない (fieldProfit として宣言)、収穫までに 80 日未満しかかからない (harvestTime として宣言)、または太陽への露出 (として宣言) sunExposure) は、その灌漑露出 (irrigationExposure として宣言) よりも大きいです。

  4. フィールドは 3 つ以上のブロンズ バッジを獲得し、少なくとも 2 つの隣接するフィールドが 2 つ以上のブロンズ バッジを獲得します。(直接隣接するのは北、南、東、西です)。

2 つのシルバー バッジ関数 (Poly バッジと Any Color バッジ) のコードは次のとおりです。

int countBadges(int x, int y) {
   int mavebadge, incirclebadge, herobadge, weatherbadge, inquattrobadge,
      total;

   mavebadge = badgeBoundaryMaven(x, y);
   incirclebadge = badgeInnerCircle(x, y);
   herobadge = badgeLocalHero(x, y);
   weatherbadge = badgeBoringWeather(x, y);
   inquattrobadge = badgeInQuattro(x, y);

   total = mavebadge + incirclebadge + herobadge + weatherbadge +
      inquattrobadge;

   return total;

   printf("Total number: %d\n", countBadges(2, 2));
}

int badgePoly(int x, int y) {
   int bronzebadges, polybadge;

   if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
      bronzebadges = countBadges(x, y);
      if (bronzebadges >= 2) {
         polybadge = 1;
      }
      else {
         polybadge = 0;
      }
   }
   else {
      polybadge = -1;
   }

   return polybadge;
}


int badgeAnyColor(int x, int y) {
   int bronzebadges, northbadges, northeastbadges, northwestbadges, eastbadges,
      westbadges, southbadges, southeastbadges, southwestbadges, colorbadge;

   double fs, ht, fp, sunexp, irrexp;

   if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
      fs = fieldScore(x, y);
      ht = harvestTime(x, y);
      fp = fieldProfit(x, y);
      sunexp = sunExposure(x, y);
      irrexp = irrigationExposure(x, y);
      bronzebadges = countBadges(x, y);
      northbadges = countBadges(x, y + 1);
      northeastbadges = countBadges(x + 1, y + 1);
      northwestbadges = countBadges(x - 1, y + 1);
      eastbadges = countBadges(x + 1, y);
      westbadges = countBadges(x - 1, y);
      southbadges = countBadges(x - 1, y - 1);
      southeastbadges = countBadges(x + 1, y - 1);
      southwestbadges = countBadges(x - 1, y - 1);

      switch (bronzebadges) {
         case 0: {
            if (x == 1 && y == 1){
               if (northbadges == 0 && northeastbadges == 0 &&
                  eastbadges == 0){
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 1) {
               if (northbadges == 0 && northwestbadges == 0 &&
                  westbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
           }
            if (x == 1 && y == 20) {
               if (eastbadges == 0 && southeastbadges == 0 &&
                  southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
           }
            if (x == 20 && y == 20) {
               if (westbadges == 0 && southwestbadges == 0 &&
                  southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y == 1)) {
               if (westbadges == 0 && northwestbadges == 0 && northbadges == 0
                  && northeastbadges == 0 && eastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y == 20)) {
               if (westbadges == 0 && southwestbadges == 0 && southbadges == 0
                  && southeastbadges == 0 && eastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 20) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northwestbadges == 0 &&
                  westbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 1) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northeastbadges == 0 && eastbadges == 0
                  && southeastbadges == 0 && southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northwestbadges == 0 && westbadges == 0
                  && southwestbadges == 0 && southbadges == 0 &&
                     southeastbadges == 0 && eastbadges == 0 &&
                        northeastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            break;
         }
         case 1: {
            if (fs >= 20) {
               colorbadge = 1;
            }
            else {
               colorbadge = 0;
            }
            break;
         }
         case 2: {
            if (fp <= 0 || ht < 80 || sunexp > irrexp) {
               colorbadge = 1;
            }
            else {
               colorbadge = 0;
            }
            break;
         }
         case 3:
         case 4:
         case 5: {
            if ((x >= 2 && x <= 19) && y == 1) {
               if (((westbadges + northbadges) >= 2) || ((northbadges +
                  eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 1 && y == 1) {
               if ((northbadges + eastbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 1) {
               if ((northbadges + westbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 1 && y == 20) {
               if ((southbadges + eastbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 20) {
               if ((southbadges + westbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && y == 20) {
               if (((westbadges + southbadges) >= 2) || ((southbadges +
                  eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 1) && (y >= 2 && y <= 19)) {
               if (((northbadges + eastbadges) >= 2) || ((eastbadges +
                  southbadges) >= 2) || ((northbadges + southbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 20) && (y >= 2 && y <= 19)) {
               if (((northbadges + westbadges) >= 2) || ((westbadges +
                  southbadges) >= 2) || ((northbadges + southbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19)) {
               if (((northbadges + westbadges) >= 2) || ((westbadges +
                  southbadges) >= 2) || ((southbadges + eastbadges) >= 2) ||
                     ((northbadges + southbadges) >= 2) || ((westbadges +
                        eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            break;
         }
      }
   }
   else {
      colorbadge = -1;
   }
   return colorbadge;
}
4

1 に答える 1

1

countBadges(x,y) 関数には printf の前に return ステートメントがあるため、printf は印刷されません。return の上に移動し、必要ない場合はコメントアウトする必要があります。printf で他の問題が発生する可能性があります。

int countBadges(int x, int y)
{
    int mavebadge, incirclebadge, herobadge, weatherbadge, inquattrobadge,
        total;

    mavebadge = badgeBoundaryMaven(x, y);
    incirclebadge = badgeInnerCircle(x, y);
    herobadge = badgeLocalHero(x, y);
    weatherbadge = badgeBoringWeather(x, y);
    inquattrobadge = badgeInQuattro(x, y);

    total = mavebadge + incirclebadge + herobadge + weatherbadge +
        inquattrobadge;

    printf("Total number: %d\n", countBadges(2, 2));
    return total;
}

グリッドの位置を頻繁にチェックするので、ongrid(x,y) 関数 (またはマクロ) を提案し、それを使用して有効なグリッド境界の位置をチェックします。

int ongrid(x,y)
{
    return ( (x>=1) && (x<=20) && (y>=1) && (y<=20) );
}

境界条件も確認する必要があります。

  if( y + 1<=20 )
      northbadges = countBadges(x, y + 1);
  if( x + 1<=20 && y + 1<=20 )
     northeastbadges = countBadges(x + 1, y + 1);
  if( x - 1>=1 && y + 1<=20 )
     northwestbadges = countBadges(x - 1, y + 1);
  if( x + 1<=20 )
     eastbadges = countBadges(x + 1, y);
  if( x - 1<=20 )
     westbadges = countBadges(x - 1, y);
  if( y - 1>=1 )
     southbadges = countBadges(x, y - 1); //this value was probably not right
  if( x + 1<=20 && y - 1>=1 )
     southeastbadges = countBadges(x + 1, y - 1);
  if( x - 1>=1 && y - 1>=1 )
     southwestbadges = countBadges(x - 1, y - 1);

より明確にするために ongrid() 関数で書き直しました。

  if( ongrid(x,y + 1) )
      northbadges = countBadges(x, y + 1);
  if( ongrid(x + 1,y + 1) )
     northeastbadges = countBadges(x + 1, y + 1);
  if( ongrid(x - 1,y + 1) )
     northwestbadges = countBadges(x - 1, y + 1);
  if( ongrid(x + 1,y) )
     eastbadges = countBadges(x + 1, y);
  if( ongrid(x - 1,y) )
     westbadges = countBadges(x - 1, y);
  if( ongrid(x,y - 1) )
     southbadges = countBadges(x, y - 1);
  if( ongrid(x + 1,y - 1) )
     southeastbadges = countBadges(x + 1, y - 1);
  if( ongrid(x - 1,y - 1) )
     southwestbadges = countBadges(x - 1, y - 1);

ブロンズ バッジの switch ステートメントにはデフォルトがありません。バッジの数が明示的に示された数と異なる場合に備えて、デフォルトを処理する必要があります。

     default : {
         break;
     }
于 2013-10-24T22:09:06.470 に答える