フォーチュンは、左の法則をジグザグプリント行列Cに基づいclass3-タイトル8 ++リアライズ

フォーチュンは、左の法則をジグザグプリント行列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;
}

5.出力

ここに画像を挿入説明

公開された51元の記事 ウォンの賞賛1 ビュー1386

おすすめ

転載: blog.csdn.net/shi_xiao_xuan/article/details/103673365