USACO 1.2.2 Transformations(模拟)
分析 这是我第一次在ACM的题目中用OO的思想写的程序,看到标程,竟不谋而合,结构是类的。对正方形这个类分析,将会使问题变得简单,我觉得OO的分析和设计挺关键的,其实我一开始也没设计好,原先准备把7个bool函数当成类的成员方法,其实这个设计是不好的,
分析
这是我第一次在ACM的题目中用OO的思想写的程序,看到标程,竟不谋而合,结构是类似的。对正方形这个类分析,将会使问题变得简单,我觉得OO的分析和设计挺关键的,其实我一开始也没设计好,原先准备把7个bool函数当成类的成员方法,其实这个设计是不好的,有点过了。其实应该是把旋转90度和轴对称这两个方法作为类的成员方法,这样main中调用就方便自如了。
最后,我觉得搞ACM,不仅是把题目A掉,同时也应注意程序的结构设计,因为”程序是给人看的“。
2013/3/31
关于顺时针旋转90度,怎么由原来的坐标得到转换后的坐标,可以用计算机图像学里二维变换的知识,将连续推广到离散的,如下图所示。
为了与二维数组对应,我将坐标系顺时针旋转了90度,这样就与二维数组的下标情况对应了,假设n为4。
关于变换矩阵,先把参考点移到原点,再顺时针旋转90度,最后移回原来参考点。复合变换矩阵:
MATLAB程序如下:
clc; clear all; syms x y n; P = [x y 1]; xF = (n - 1) / 2.0; % center = (xF yF) yF = xF; % theta = -pi / 2.0; Tt1 = [ 1 0 0; 0 1 0; -xF -yF 1 ]; % 精度有损失 % Tr = [ % cos(theta) sin(theta) 0; % -sin(theta) cos(theta) 0; % 0 0 1 % ]; Tr = [ 0 -1 0; 1 0 0; 0 0 1 ]; Tt2 = [ 1 0 0; 0 1 0; xF yF 1 ]; Pt = P * Tt1 * Tr * Tt2; display(P); display(Pt);
P = [ x, y, 1] Pt = [ y, n - x - 1, 1]
源程序
// #define ONLINE_JUDGE #define MY_DEBUG #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <string> #include <algorithm> #include <cstdio> #include <cassert> using namespace std; class Square { private: typedef vector<char> vChar; typedef vector<vchar> vvChar; vvChar data; unsigned n; public: // 用边长来构造 Square (unsigned _n) : n(_n) {} Square rotateClockwise90() { Square tmp(n); for (unsigned int i = 0; i data[n - 1 - j][i]); } tmp.data.push_back(vcTmp); } return tmp; } Square rotateClockwise180() { return this->rotateClockwise90().rotateClockwise90(); } Square rotateClockwise270() { return this->rotateClockwise180().rotateClockwise90(); } Square reflecteHorizontal() { Square tmp(n); for (unsigned int i = 0; i data[i][n - j - 1]); } tmp.data.push_back(vcTmp); } return tmp; } bool operator==(const Square &other) const { if (this->n != other.n) { return false; } for (unsigned i = 0; i data[i][j] != other.data[i][j]) { return false; } } } return true; } friend istream & operator>>(istream& is, Square &s) { for (unsigned int i = 0; i > cTmp; vcTmp.push_back(cTmp); } s.data.push_back(vcTmp); } return is; } friend ostream & operator= 1) { cout = 1) { cout > sideLen; Square sa(sideLen); Square sb(sideLen); cin >> sa >> sb; #ifndef MY_DEBUG cout <p><br> </p> <p><br> </p> <p><br> </p> <p>附:</p> <h3 id="标程">标程</h3> <p>注:它的旋转函数中坐标变换错了。</p> <pre class="brush:php;toolbar:false">#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAXN 10 typedef struct Board Board; struct Board { int n; char b[MAXN][MAXN]; }; /* rotate 90 degree clockwise: [r, c] -> [c, n+1 - r] */ Board rotate(Board b) { Board nb; int r, c; nb = b; for(r=0; r<b.n r for c nb.b b.b return nb reflect board horizontally:> [r, n-1 -c] */ Board reflect(Board b) { Board nb; int r, c; nb = b; for(r=0; r<b.n r for c nb.b b.b return nb non-zero if and only boards are equal int eqboard b board bb bb.n bb.b rdboard n b.n="n;" getc assert void main file change fin='fopen("transform.in",' fout='fopen("transform.out",' null fscanf rotate else reflect fprintf exit><br> <h3 id="题目">题目</h3> <center> <strong><span>Transformations</span></strong><br> </center> <p>A square pattern of size N x N (1 </p> <ul> <li>#1: 90 Degree Rotation: The pattern was rotated clockwise 90 degrees.</li> <li>#2: 180 Degree Rotation: The pattern was rotated clockwise 180 degrees.</li> <li>#3: 270 Degree Rotation: The pattern was rotated clockwise 270 degrees.</li> <li>#4: Reflection: The pattern was reflected horizontally (turned into a mirror image of itself by reflecting around a vertical line in the middle of the image).</li> <li>#5: Combination: The pattern was reflected horizontally and then subjected to one of the rotations (#1-#3).</li> <li>#6: No Change: The original pattern was not changed.</li> <li>#7: Invalid Transformation: The new pattern was not obtained by any of the above methods.</li> </ul> <p>In the case that more than one transform could have been used, choose the one with the minimum number above.</p> <h3 id="PROGRAM-NAME-transform">PROGRAM NAME: transform</h3> <h3 id="INPUT-FORMAT">INPUT FORMAT</h3> <table> <tbody> <tr> <td>Line 1:</td> <td>A single integer, N</td> </tr> <tr> <td>Line 2..N+1:</td> <td>N lines of N characters (each either `@' or `-'); this is the square before transformation</td> </tr> <tr> <td>Line N+2..2*N+1:</td> <td>N lines of N characters (each either `@' or `-'); this is the square after transformation</td> </tr> </tbody> </table> <h3 id="SAMPLE-INPUT-file-transform-in">SAMPLE INPUT (file transform.in)</h3> <pre class="brush:php;toolbar:false">3 @-@ --- @@- @-@ @-- --@
OUTPUT FORMAT
A single line containing the the number from 1 through 7 (described above) that categorizes the transformation required to change from the `before' representation to the `after' representation.SAMPLE OUTPUT (file transform.out)
1

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









機械学習でコンピューターグラフィックス(CG)シミュレーションがよりリアルに!この方法はニューラル フロー マップ (NFM) と呼ばれ、4 つの渦で煙を正確にシミュレートできます。より複雑なものも簡単に実現できます。AI アプリケーションが空を飛び回るこの時代においても、CG 物理シミュレーションは依然として重要です。従来の数値アルゴリズムの世界です。 △NFM は「リープフロッグ」をシミュレートします CG にニューラル ネットワークを適用すると、めくるめく視覚効果を生み出すことができますが、物理的特性を厳密かつロバストに記述することはできません。 △NFMは「インク滴」をシミュレートする だからこそ、ニューラルネットワークに基づく物理シミュレーションはまだ概念実証の段階にあり、生み出される効果はSOTAとは程遠い。この複雑な問題を解決するために、

Transformer はさまざまな機械学習タスクで人気の選択肢となり、優れた成果を上げていますが、他にどのように使用できるでしょうか?優れた想像力を持つ研究者は、実際にそれをプログラマブル コンピューターの設計に使用したいと考えています。 「プログラマブル コンピュータとしてのループ トランスフォーマー」と題されたこの論文の著者はプリンストン大学とウィスコンシン大学の出身で、トランスフォーマーを使用して汎用コンピュータを実装する方法を探ることを目的としています。具体的には、変圧器ネットワークを特定の重みでプログラムし、ループ内に配置することで、変圧器ネットワークを汎用コンピュータとして使用するためのフレームワークを提案しています。この枠組みの中で

最近、Samsung は、ローカル AI 機能を強化し、よりパーソナライズされた AI エクスペリエンスをユーザーに提供するために、英国のナレッジ グラフ スタートアップである Oxford Semantic Technologies の買収を発表しました。同社の主力製品は、ナレッジ グラフ テクノロジを使用して情報を相互接続されたネットワークとして保存する AI エンジン RDFox です。データの処理方法は、知識の取得、記憶、思い出し、推論という人間の思考方法と似ています。このテクノロジーにより、ユーザーが使用する製品やサービスに対するデバイスの理解が深まり、迅速な情報検索や推奨が可能になります。オックスフォード セマンティック テクノロジーズは、オックスフォード大学教授のイアン ホロックス氏、ボリス モティック氏、ベルナルド クエンカ氏の 3 人によって 2017 年に設立されたことがわかっています。

PHP および WebDriver 拡張機能: ユーザーのスクロールおよびドラッグ動作をシミュレートする方法 ネットワーク アプリケーションの継続的な開発に伴い、ユーザーのスクロールおよびドラッグ動作をシミュレートする必要がある Web サイトやアプリケーションがますます増えています。これは、テスターや開発者にとって、Web サイトやアプリケーションがさまざまなシナリオで適切に動作することを確認するために非常に重要です。この記事では、PHP および WebDriver 拡張機能を使用して、ユーザーのスクロールとドラッグの動作をシミュレートする方法を紹介します。 WebDriver はブラウザを自動化するツールです。

API のテストとシミュレーションに GitLab を使用する方法 はじめに: ソフトウェア開発のプロセスにおいて、API (アプリケーション プログラミング インターフェイス、アプリケーション プログラミング インターフェイス) のテストとシミュレーションは非常に重要なステップであり、開発者が API の正確さとパフォーマンスを検証するのに役立ちます。潜在的な問題を事前に発見できます。 GitLab は、バージョン管理やチーム コラボレーションなどの機能を実装する、非常に人気のあるコード ホスティング プラットフォームです。この記事ではGitの使い方を紹介します。

乱数シミュレーションには math/rand パッケージを使用します。 math/rand パッケージをインポートします。 time.Now().UnixNano() を使用して乱数ジェネレーターを初期化します。 rand.Intn(n) を使用して、0 から n-1 までのランダムな整数を生成します。 rand.Float64() を使用して、0 から 1 までの浮動小数点数を生成します。

Python と量子コンピューティング、一見遠く離れていてまったく異なる 2 つの分野が信じられないほど絡み合い、アルゴリズムと量子状態の調和のとれた音を奏で、デジタル世界の壮大な交響曲を構成しています。 Python のシンプルさと優雅さと、量子コンピューティングの驚異と神秘が互いに衝突して無限の火花を生み出し、複雑な問題を解決し、量子コンピューティングの新時代を開く刺激的な可能性を提供します。人気のあるプログラミング言語である Python は、その学習の容易さ、豊富なライブラリ、および幅広いアプリケーションにより、量子コンピューティングの分野で不可欠なツールとなっています。 Python の出現により、量子コンピューティングの敷居が下がり、より多くの人がこの最先端分野の研究や応用に参加できるようになりました。 NumPy や SciPy など、量子コンピューティング用の Python の多数のライブラリ

1. はじめに JUnit は Java 言語で最も人気のある単体テスト フレームワークであり、読みやすく、保守しやすく、信頼性の高いテスト コードの作成と保守を容易にします。このガイドでは、Java アプリケーションのテストに JUnit を効果的に使用するための段階的な手順、コード例、ベスト プラクティスのヒントを提供します。 2. はじめに 2.1 テスト プロジェクトのセットアップ JUnit の依存関係をプロジェクトに追加して、テスト機能を有効にします。 Maven を使用する場合は、pom.xml ファイルに次の依存関係を追加します: junitjunit
