フォーチュンは、左の法則をジグザグプリント行列Cに基づいclass3-タイトル8 ++リアライズ
1.トピック
1,234,567,891,011,121,314 15 16:「」、例えばによるマトリクスマトリクス、このマトリクスの印刷ジグザグ与え ""ジグザグ印刷結果である:1,259,634,710,131,411,812 15 16
[クレーム]余分なスペースの複雑さはO(1)です。
2.分析
出力マトリクス状のタイトルは、左下と右上方向の2つの出力に右上左下の方向に応じて分割することができ、出力は、実際には変化の方向が特定のブール変数として使用することができ、斜めに見ることができます。二つの補助点としてA、Bを設定する検討、開始A、B 2点(0,0)の角位置(0,0)の左上の位置です。
(1)ABの要求出力との間のデジタル接続であり、右のA、Bまでのラウンド移動を出力する;
(2)ブール変数を使用して印刷が逆の各ラウンド後に採取し、印刷の向きを表し;
(3 Aが右端までである場合)、右の最下端にBが移動し、右下の端部Aに移動するまで、出力は、図に従います。
3.コアコード
アップデート(1)A、B点
最下端Arに移動するときは、AC、BCは列を表し、AR、ARは、行を表します。コードを更新しました4つの変数は、より簡潔にすることができますEXP1 EXE2 :? EXP3を使用するように変更することができます。
while(aR!=height)
{
print(arr,dir,aR,aC,bR,bC);
if(aC < width - 1)
{
aC++;
}
else
{
aR++;
}
if(bR < height - 1)
{
bR++;
}
else
{
bC++;
}
dir = !dir;
}
(2)の間の数はA、Bを印刷します
Aを印刷し、実際のデジタル印刷の間にBがAであり、接続上のB番号あなたが行と列の数を変更するたびにすることができます。それはA.に遭遇するまで、印刷を継続する行を追加し、印刷する権利、及びB、保存ライン左から斜め それはB.に遭遇するまで行を追加するには、左斜め印刷する権利、およびAから、カラムは、次いで、印刷を継続する、減少させます アイデアは、最初の印刷が完了すると、両方のプリントまで、次の点を見つけるために、中間変数の記録位置を使用し、その後、中間変数を変更することで、A、B、座標を変更しないであろう。この機能の一部としてパッケージ化することができると思う、利点は、印刷のためのパラメータ、引数、直接変更A、Bの座標を変更しただけでなく、冗長な変数を排除していません。
void print(int arr[][width],bool dir,int aR,int aC,int bR,int bC)
{
if(dir)
{
while(bR >= aR)
{
cout<<arr[bR--][bC++]<<" ";
}
}
else
{
while(aR <= bR)
{
cout<<arr[aR++][aC--]<<" ";
}
}
}
4.完全なコード
#include<iostream>
#define height 4
#define width 4
using namespace std;
void print(int arr[][width],bool dir,int aR,int aC,int bR,int bC)
{
if(dir)
{
while(bR >= aR)
{
cout<<arr[bR--][bC++]<<" ";
}
}
else
{
while(aR <= bR)
{
cout<<arr[aR++][aC--]<<" ";
}
}
}
int main()
{
//int arr[height][width] = {1,2,3,4,5,6,7,8,9};
int arr[height][width] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int aR = 0,aC = 0,bR = 0,bC = 0;
bool dir = true;
while(aR!=height)
{
print(arr,dir,aR,aC,bR,bC);
if(aC < width - 1)
{
aC++;
}
else
{
aR++;
}
if(bR < height - 1)
{
bR++;
}
else
{
bC++;
}
dir = !dir;
}
system("pause");
return 0;
}