1.トピック
整数行列の行列を考えると、道の円形の動きに合わせてそれを印刷してください。
例えば:1,234,567,891,011,121,314 15 16の印刷結果:1,2,3,4,8,12,16,15,14,13,9,5,6,7、図11は、10
[]に必要な余分なスペースの複雑さはO(1)です。
2.分析
(1)以下に示すようにタイトルは、B、C、Dの境界線を制御するための4つの変数を考慮し、Cが行を示し、B、Dは列を表し(b)の左上隅で、(C、D)であります右下隅。主題に従って逆ウェールB、横行逆cは横方向、Dウェールズ、印刷を必要とします。後++、B ++、C、D、すなわち、右下隅点移動する左上隅の右下隅点が移動する左上隅。四角枠の内側に印刷を続行し、その値(a、b)は、間違ったまたは端部と、(C、D)が一致するまで、B、C、Dを変更します。
対価図印刷モードで印刷を容易にするために(2)は、変曲点は、次の印刷、残り印刷枚数の開始に設定されていません。
3.コアコード
(2)図のタイトルのように、個々の行と列を形成するために、最終的なプリントのグループ、および印刷のための正方形のフレームを構成しない、それが、但し、そのAと、決定する必要がありますCとBD。
void print_num(int arr[][height],int a,int b,int c,int d)
{
if(a==c)
{
for(int i = b;i <= d;i++)
{
cout<<arr[a][i]<<" ";
}
}
else if(b==d)
{
for(int i = a;i <= c;i++)
{
cout<<arr[i][b]<<" ";
}
}
else
{
int cur_i = a;
int cur_j = b;
while(cur_j != d)
{
cout<<arr[a][cur_j]<<" ";
cur_j++;
}
while(cur_i != c)
{
cout<<arr[cur_i][d]<<" ";
cur_i++;
}
while(cur_j != b)
{
cout<<arr[c][cur_j]<<" ";
cur_j--;
}
while(cur_i != a)
{
cout<<arr[cur_i][b]<<" ";
cur_i--;
}
}
}
(2)は、彼らが最後に残った数を印刷しなければならない場合が一致したときに同じ番号が参照して印刷条件は、左上隅の点が間違った点右下隅とすることができないで呼び出し
while(a <= c && b <= d)
{
print_num(arr,a,b,c,d);
a++,b++,c--,d--;
}
4.完全なコード
#include<iostream>
#define height 3
#define width 3
using namespace std;
void print_num(int arr[][height],int a,int b,int c,int d)
{
if(a==c)
{
for(int i = b;i <= d;i++)
{
cout<<arr[a][i]<<" ";
}
}
else if(b==d)
{
for(int i = a;i <= c;i++)
{
cout<<arr[i][b]<<" ";
}
}
else
{
int cur_i = a;
int cur_j = b;
while(cur_j != d)
{
cout<<arr[a][cur_j]<<" ";
cur_j++;
}
while(cur_i != c)
{
cout<<arr[cur_i][d]<<" ";
cur_i++;
}
while(cur_j != b)
{
cout<<arr[c][cur_j]<<" ";
cur_j--;
}
while(cur_i != a)
{
cout<<arr[cur_i][b]<<" ";
cur_i--;
}
}
}
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 a = 0,b = 0,c = height - 1,d = width - 1;
while(a <= c && b <= d)
{
print_num(arr,a,b,c,d);
a++,b++,c--,d--;
}
system("pause");
return 0;
}