24h購物| | PChome| 登入
2009-07-10 19:41:48| 人氣678| 回應0 | 上一篇 | 下一篇

算算算....Normal

推薦 0 收藏 0 轉貼0 訂閱站台

d156. 有獎徵答:有多少矩形? 的翻版
(d156. 有獎徵答:有多少矩形? 的解法 ←解答自己按)

總之呢...我不曉得原作者怎麼寫,不過我是這樣想的

先枚舉任兩行
再來枚舉列(重點)
例如掃到以下的圖形

  1 2 3 //列
1 * * *
2 *   *
3 * * *

(行,列)

首先舉出1跟2行,首先是掃到(1,1)跟(2,1)與(1,3)跟(2,2)

是有成對的,不過在中間(2,2)是空心的無法拉線過去,所以掃到空心就要分隔計算

詳細請參考程式碼...(國文不好請見諒)

/************************************************************/

#include<stdio.h>  
#include<stdlib.h>  
main()  
{  
 int x1, y1, x2, y2, x3, y3, x4, y4;
 int x5, y5, x6, y6, x7, y7, x8, y8;
 while(scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)==8)  
   {  
     scanf("%d %d %d %d %d %d %d %d",&x5,&y5,&x6,&y6,&x7,&y7,&x8,&y8);
      int map[101][101]={0},ans=0,a,b,c,d;  
      for(a=x1;a<=x2;a++)
        for(b=y1;b<=y4;b++)
          map[a][b]=1;
      for(a=x5+1;a<x6;a++)
        for(b=y5+1;b<y8;b++)
          map[a][b]=0; 
       for(a=x1;a<=x2;a++)  
        for(b=a+1;b<=x2;b++)   
         {  
          int temp=0;
           for(c=y1;c<=y4;c++)
            {
             if(map[a][c]==1&&map[b][c]==1)
               {
                for(d=a;d<=b;d++) if(map[d][c]==0) break;
                if(d==b+1)
                temp++;  
               }
             if(map[a][c]==0||map[b][c]==0)
               {                
                 if(temp>1) {ans=ans+((temp-1)*(temp))/2;}temp=0;
               }
            }
           if(temp>1) {ans=ans+((temp-1)*(temp))/2;}    
         }      
        printf("%d\n",ans);   
   }   
 return 0;  
}

台長: 來源不明
人氣(678) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:中国字
此分類上一篇:挑戰極限 Part3 - 阿拉伯之夜階乘

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文