這是2023年第三屆藍橋杯全國軟體大賽預賽(c++本科組)第7題,要求將**補全,實現「每行每列都正好有3顆棋子」的功能。
今有 6 x 6 的棋盤格。其中某些格仔已經預先放好了棋子。現在要再放上去一些,使得:每行每列都正好有3顆棋子。我們希望推算出所有可能的放法。下面的**就實現了這個功能。
初始陣列中,「1」表示放有棋子,「0」表示空白。
int n = 0;
bool checkstonenum(int x[6])
if(_____________________) return false; // 填空
} return true;
}int getrowstonenum(int x[6], int r)
int getcolstonenum(int x[6], int c)
void show(int x[6])
printf("\n");
}void f(int x[6], int r, int c);
void gonext(int x[6], int r, int c)
void f(int x[6], int r, int c)
return;
} if(______________) // 已經放有了棋子
int rr = getrowstonenum(x,r);
int cc = getcolstonenum(x,c);
if(cc>=3) // 本列已滿
gonext(x,r,c);
else if(rr>=3) // 本行已滿
f(x, r+1, 0);
else }
int main(int argc, char* argv)
, ,
, ,
, }; f(x, 0, 0);
printf("%d\n", n);
return 0;
}
請分析**邏輯,並推測劃線處的**。
答案寫在 「解答.txt」 檔案中
注意:只寫劃線處應該填的內容,劃線前後的內容不要抄寫。
該題的難點在讀懂每個函式的作用:
# include int n = 0;
bool checkstonenum(int x[6])
if(numrow != 3 || numcol != 3) return false; // 填空
} return true;
}int getrowstonenum(int x[6], int r)
int getcolstonenum(int x[6], int c)
void show(int x[6])
printf("\n");
}void f(int x[6], int r, int c);
void gonext(int x[6], int r, int c)
void f(int x[6], int r, int c)
return;
} if(x[r][c] == 1) // 已經放有了棋子
int rr = getrowstonenum(x,r);
int cc = getcolstonenum(x,c);
if(cc>=3) // 本列已滿
gonext(x,r,c);
else if(rr>=3) // 本行已滿
f(x, r+1, 0);
else }
int main(int argc, char* argv)
, ,
, ,
, }; f(x, 0, 0);
printf("%d\n", n);
return 0;
}
numrow != 3 || numcol != 3
f(x, r, c + 1)
x[r][c] == 1
2023年藍橋杯預賽第七題放棋子
if return false 填空 return true int getrowstonenum int x 6 int r int getcolstonenum int x 6 int c void show int x 6 printf n void f int x 6 int r,int c...
藍橋杯 瓷磚鋪放 搜尋
有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方法求解上述問題。輸入...
藍橋杯 瓷磚鋪放 遞迴
問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方法求解上述...