日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

25行代码AC_ 2017年C/C++ A组第四题 方格分割(dfs剪痕+解题报告)

發布時間:2024/2/28 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 25行代码AC_ 2017年C/C++ A组第四题 方格分割(dfs剪痕+解题报告) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

勵志用少的代碼做高效表達


問題描述:

6x6的方格,沿著格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。
?
如圖:p1.png, p2.png, p3.png 就是可行的分割法。
?
試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬于同一種分割法。


題意分析

幾種分析思路:

暴力列舉: 直接枚舉18個點,然后判斷。 但時間耗費太高。 放棄。

對格子dfs:dfs無法識別T型圖案(因為深搜只能遍歷一條路),因此放棄

想了又想, 如果對邊線進行dfs,從中間點出發,最后只要用深搜能到達邊界, 就代表著這條線把整個圖案分成了兩半。 思路就出來了!

注意:圖形是可以旋轉的,因此最后的結果要除以4!


剪刀剪痕與dfs邊界如下圖所示:


代碼展示:

#include<iostream> using namespace std; int vis[10][10]; int dire[4][2] = {-1,0, 1,0, 0,-1, 0,1}; int ans;void dfs(int x, int y) {if(x==0 || y==6 || x==6 || y==0) {ans++; return;} // 當前的點標注為已訪問vis[x][y] = 1;vis[6-x][6-y] = 1; for(int i = 0; i < 4; i++) {int tx = x+dire[i][0];int ty = y+dire[i][1]; // 新坐標if(tx<0 || tx>6 || ty<0 || ty>6) continue;if(!vis[tx][ty]) dfs(tx, ty); }vis[x][y] = 0;vis[6-x][6-y] = 0; }int main() {vis[3][3] = 1;dfs(3, 3);cout << ans/4 << endl; return 0; }

感想與總結

1、藍橋杯的絕大多數題都是搜索或暴力,而近兩年純暴力的題越來越少,取而代之的是模擬+搜索或暴力+搜索

2、本題就是一道非常標準的 模擬+搜索 類型題。 關于暴力+搜索,可參考2016年B組7題的剪郵票, 也很經典, 題目+題解,傳送門

3、對于對稱類型的題, 一定要考慮是否有重復的情況出現。


把手舉過頭頂,突然張開五指,那么,恭喜你給自己放了個煙花!

總結

以上是生活随笔為你收集整理的25行代码AC_ 2017年C/C++ A组第四题 方格分割(dfs剪痕+解题报告)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。