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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...