首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

CCF 201403-2 窗口模擬:C 語言 bool 類型導致 0 分排查記錄

     編輯:程式設計疑難解答

題目回顧

模擬圖形界面窗口點擊置頂邏輯:N 個矩形窗口 (底層→頂層),M 次點擊。點擊位置屬於多個窗口時,選中最頂層窗口並移至最頂層;無窗口則輸出 IGNORED。N, M ≤ 10,座標 ≤ 2559/1439。

代碼邏輯分析 (原代碼基本正確)

  • 結構體 Window 存儲座標與層級 floor (1..N)。
  • 點擊處理:從頂層 (j=N-1) 向下遍歷,檢測點是否在矩形內 (含邊界 >= <=)。
  • 命中後:輸出 floor,將該窗口移至數組末尾 (頂層),中間窗口前移,break。
  • 未命中:輸出 IGNORED。

邏輯無誤,樣例輸出匹配。

致命錯誤:C 語言無原生 bool 類型

struct CLICK {
    int x;
    int y;
    bool flag; // 錯誤!C89/C99 標準無 bool
} c[M];

後果: 編譯器 (如 GCC 默認模式) 將 bool 視為未聲明標識符或報錯,導致編譯失敗 (CE),OJ 判 0 分。

修正方案

方案一:使用 int 代替 (最兼容)

struct CLICK {
    int x;
    int y;
    int flag; // 0 = false, 1 = true
} c[M];

// 使用時
c[i].flag = 0; 
// ...
c[i].flag = 1;
if (c[i].flag == 0) ...

方案二:引入 <stdbool.h> (C99 標準)

#include <stdbool.h> // 頂部包含

struct CLICK {
    int x;
    int y;
    bool flag; // 現在合法了
} c[M];

注意: 部分老舊 OJ 編譯環境可能不支持 C99 或默認不開啟,方案一最保險。

其他潛在優化 (非必需)

  1. 邊界判斷: 題目保證 x1 < x2, y1 < y2,直接用 >= && <= 正確。
  2. 數組大小: N, M ≤ 10,W[10], c[10] 足夠,VLA (Variable Length Array) W[N] 在 C99 合法但部分編譯器不支持,建議定義最大常量 #define MAX_N 10。
  3. 輸入讀取: scanf 返回值檢查非必需,但加上更健壯。

總結

算法邏輯正確,僅因 C 語言標準差異導致 bool 編譯失敗。競賽中**默認使用 int 表示布爾值**是避免此類低級錯誤的鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved