codeforces 54B Cutting Jigsaw Puzzle題解

来源:https://www.cnblogs.com/xiaowuyi/archive/2022/08/02/16542447.html
-Advertisement-
Play Games

詳情請見:CSDN 阿史大杯茶 https://blog.csdn.net/weixin_66946161/article/details/126093709 題目意思 本題主要意思就是切成 一個個小塊(小塊的面積相同,但小塊不相同),使小塊之間互不相等,而且旋轉之後相同,也算小塊相同!例: AB ...


詳情請見:CSDN 阿史大杯茶   https://blog.csdn.net/weixin_66946161/article/details/126093709

題目意思


本題主要意思就是切成 一個個小塊(小塊的面積相同,但小塊不相同),使小塊之間互不相等,而且旋轉之後相同,也算小塊相同!例:

AB    CA
CD    DB
這兩個是相同的!

最後輸出一共可以有多少種切法,使他們互不相等,然後輸出切出的最小塊 (這裡要註意如果面積相等,則輸出 a 小的那一個)比如說: 和 ,是要輸出 !

思路:

這道題主要就是取塊以及旋轉判斷:

取塊:這個很簡單,只需雙重for迴圈,不停的枚舉中的 a 和 b,如果a或b不能被N或M整除,那麼是不行的所以要continue!

旋轉判斷:這個就比較麻煩了!首先就是旋轉,旋轉要麼是180度、90度或270度。但是長方形只用轉180度,因為長方形轉其他兩個度數會改變形狀,那麼和其他長方形就不可能相等!

180度旋轉:

A0,0 A0,1 A0,2        A2,2 A2,1 A2,0
A1,0 A1,1 A1,2        A1,2 A1,1 A1,0
A2,0 A2,1 A2,2        A0,2 A0,1 A0,0

我們可以發現Ax,y旋轉180度之後 x是從a-1->0,y是從b-1->0,所以我們就for迴圈按前面的順序讀進一個string里

for (int xx=i-1;xx>=0;xx--){//i就是a
    for (int yy=j-1;yy>=0;yy--){//j就是b
        pc+=pzl[x+xx][y+yy];
    }
}

90度旋轉:

A0,0 A0,1 A0,2        A2,0 A1,0 A0,0
A1,0 A1,1 A1,2        A2,1 A1,1 A0,1
A2,0 A2,1 A2,2        A2,2 A1,2 A0,2

我們可以發現Ax,y旋轉90度之後 x是從a-1->0,y是從0->b-1,但是我們發現每一行y沒在變化,所以y的for迴圈要在外面

for (int yy=0;yy<j;yy++){
    for (int xx=i-1;xx>=0;xx--){
        pc+=pzl[x+xx][y+yy];
    }
}

270度旋轉:

A0,0 A0,1 A0,2        A0,2 A1,2 A2,2
A1,0 A1,1 A1,2        A0,1 A1,1 A2,1
A2,0 A2,1 A2,2        A0,0 A1,0 A2,0

我們可以發現Ax,y旋轉270度之後 x是從0->a-1,y是從b-1->0,但是我們發現每一行y沒在變化,所以y的for迴圈要在外面

for (int yy=j-1;yy>=0;yy--){    
    for (int xx=0;xx<i;xx++){
        pc+=pzl[x+xx][y+yy];
    }
}

判斷是否相同:

那麼,先就來講講判斷,我們當然可以用四個圖像去判斷,但是那樣忒麻煩了!所以,我們只需每次四個旋轉圖形的最小值,所以要用string。然後放進一個set,大家知道set是可以去重的,一去重大小就不一樣了,就能很輕鬆的判斷出來了!

代碼:

#include<bits/stdc++.h>
using namespace std;
int N,M,mina,minb,ans=0;
string pc,mnpc,pzl[25];
set<string> jdg;
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin>>N>>M;
    mina=N,minb=M;
    for (int i=0;i<N;i++) cin>>pzl[i];
    for (int i=1;i<=N;i++){
        if (N%i!=0) continue;
        for (int j=1;j<=M;j++){
            if (M%j!=0) continue;
            pc="";
            jdg.clear();
            for (int x=0;x<N;x+=i){
                for (int y=0;y<M;y+=j){
                    for (int xx=0;xx<i;xx++) for (int yy=0;yy<j;yy++) pc+=pzl[x+xx][y+yy];//賦值
                    mnpc=pc;//mnpc是四個旋轉字元串中最小的
                    pc="";
                    for (int xx=i-1;xx>=0;xx--) for (int yy=j-1;yy>=0;yy--) pc+=pzl[x+xx][y+yy];//旋轉180度
                    mnpc=min(mnpc,pc);
                    pc="";
                    if (i==j){//長方形不進行此操作
                        for (int yy=0;yy<j;yy++) for (int xx=i-1;xx>=0;xx--) pc+=pzl[x+xx][y+yy];//旋轉90度
                        mnpc=min(mnpc,pc);
                        pc="";
                        for (int yy=j-1;yy>=0;yy--) for (int xx=0;xx<i;xx++) pc+=pzl[x+xx][y+yy];//旋轉270度
                        mnpc=min(mnpc,pc);
                        pc="";
                    }
                    jdg.insert(mnpc);//set放入每一片最小值
                }
            }
            if (jdg.size()==N*M/i/j){//如果相同就會去重,因此size會不相等
                ans++;
                if ((i*j<mina*minb)||(i<mina&&i*j==mina*minb)) mina=i,minb=j;//判斷最小
            }
        }
    }
    cout<<ans<<endl;
    cout<<mina<<" "<<minb<<endl;
    return 0;
}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 綠幕摳圖是影視製作過程中常見的技術手段,常用於視頻中摳除並替換背景,通過後期加工實現視頻剪輯製作的更多可能性。然而,綠幕摳圖技術製作成本費時費力,無法應用於日常生活。 華為視頻編輯服務近期上線目標分割能力,可通過AI智能摳圖精細化分割視頻中的目標物體,並且不局限於特定的物體類別,在主體明確、背景相對 ...
  • DAY01 電腦的介紹 特點: 1.可以進行數值計算,可以進行邏輯計算 2.具有存儲記憶功能 硬體:看得見,摸得著的 顯示器,主機,存儲器 軟體:看得見,摸不著的 系統軟體:操作系統:windows、Linux、UNIX等 應用軟體:各類app C/S架構和B/S架構 1.C/S架構:需要安裝 a ...
  • 字元串 字元串概述(個人理解字元串就是把一串字元連接在一起,而且他的值類型是常量,所以不能改變,返回值只能返回一個新的字元串) 字元串也是一個數據結構(串),將同樣的內容串在一塊。因為在對應的js裡面字元串屬於一個值類型(值類型是常量 常量是不能變)。字元串是不能改變的。結合昨天提到的數據結構裡面串 ...
  • 在我們平時開發中,經常會遇到頁面數據初始化時,頻繁調同一個介面的情況。比如echarts項目中,一個頁面可能會有幾十張圖表,如果一個介面返回所有圖表數據的話,會造成用戶過長的等待時間,再者過多圖表同時渲染,也會給頁面增加壓力,造成卡頓的現象。 我們通常會讓每個圖表單獨調一個介面,入參不同,這樣更有利 ...
  • 今天開發中遇到一個問題,echarts圖表觸摸x軸觸發tooltip會將x軸上所有的數據展示出來,但是有些場合只需要展示某些數據就可以,並不需要全部展示,如下圖: 這裡警戒線因為需要開關,所以使用填充的數據模擬,但是,觸摸後會導致連警戒線數據也顯示出來,如圖: 實際上圖表中只有荷載是真實數據需要顯示 ...
  • 原文鏈接:基於 Hexo 鍵入分享功能 前言 本站基於Hexo搭建,用的 🦋 hexo-theme-butterfly 主題 v3.7.1,請註意最新的🦋 hexo-theme-butterfly 版本已經更新到 v4.2.2 。 如果你是 v3.7.1 之外的版本,可能有些地方會有出入,請留意 ...
  • 1.獲取鍵名 2.下載excel文件靜態資源路徑報錯 // 獲取鍵名 const obj={a:1,b:2,c:3}; console.log(Object.keys(obj));//["a","b","c"] // 下載excel文件靜態資源路徑報錯問題 解決方案 將文件放在src外的public ...
  • 作者:vivo 互聯網中間件團隊- Liu Runyun 大量業務使用消息中間件進行系統間的解耦、非同步化、削峰填谷設計實現。公司內部前期基於RabbitMQ實現了一套高可用的消息中間件平臺。隨著業務的持續增長,消息體量隨之增大,對消息中間件平臺提出了更高的要求,此外在運維過程中也遇到了高可用難以保障 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...