螺旋矩阵(c语言实现)
騰訊2016年實(shí)習(xí)生筆試題
蛇形矩陣,也叫螺旋矩陣,指一個(gè)呈螺旋狀的矩陣,它的數(shù)字由第一行開(kāi)始到右邊不斷變大,向下變大,
向左變大,向上變大,如此循環(huán)。
/*
思想就是:
螺旋,有四個(gè)方向,從左到右,從上到下,從右到左,從下到上。
對(duì)于第一步,要先加上c,c從0開(kāi)始,每次執(zhí)行完一圈,就加1
第一個(gè)方向,從左到右,從(c,c)開(kāi)始,從左到右,行i不變,列j從c一直加到n-c-1
第二個(gè)方向,從上到下,因?yàn)榱衘在上一步加的多了一個(gè),需要對(duì)j進(jìn)行j--,對(duì)于i也要加1,因?yàn)榈趇行的所有數(shù)字,在上一步都完成了。
這一步,是列j不變,行i從上一步的i加1 ,一直加到n-c-1
第三個(gè)方向,從右到左,因?yàn)樾衖在上一步加多了一步,需要對(duì)i進(jìn)行i--。這一步,需要行i不變,列j需要j--,直到c。
第四個(gè)方向,從下到上,因?yàn)榱衘在上一步減多了一步,需要對(duì)j進(jìn)行j++,這一步,需要列j不變,行i一直i--,直到c+1.不能到c,因?yàn)椴荒艿竭_(dá)第c行,
第c行在第一個(gè)方向上已經(jīng)賦值過(guò)了。
*/
#include<iostream>
using namespace std;const int NMAX= 100;
int n;
/*
思想就是:
螺旋,有四個(gè)方向,從左到右,從上到下,從右到左,從下到上。
對(duì)于第一步,要先加上c,c從0開(kāi)始,每次執(zhí)行完一圈,就加1
第一個(gè)方向,從左到右,從(c,c)開(kāi)始,從左到右,行i不變,列j從c一直加到n-c-1
第二個(gè)方向,從上到下,因?yàn)榱衘在上一步加的多了一個(gè),需要對(duì)j進(jìn)行j--,對(duì)于i也要加1,因?yàn)榈趇行的所有數(shù)字,在上一步都完成了。
這一步,是列j不變,行i從上一步的i加1 ,一直加到n-c-1
第三個(gè)方向,從右到左,因?yàn)樾衖在上一步加多了一步,需要對(duì)i進(jìn)行i--。這一步,需要行i不變,列j需要j--,直到c。
第四個(gè)方向,從下到上,因?yàn)榱衘在上一步減多了一步,需要對(duì)j進(jìn)行j++,這一步,需要列j不變,行i一直i--,直到c+1.不能到c,因?yàn)椴荒艿竭_(dá)第c行,
第c行在第一個(gè)方向上已經(jīng)賦值過(guò)了。
*/
void getluoxuan1(int arrays[NMAX][NMAX])
{
//核心算法:
cout<<"從外到內(nèi)螺旋,且數(shù)字從小到大,從矩陣的左上角開(kāi)始從數(shù)字1開(kāi)始螺旋:"<<endl;
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) ?//從左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i++;i<n-c;i++) // 從上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j--;j>=c;j--)//從右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i--;i>=c+1;i--)//從下到上
{
if(ou>z) ?break;
arrays[i][j] = ou++;
}
c++;
}
}
void getluoxuan11(int arrays[NMAX][NMAX])
{
cout<<"從矩陣的左上角開(kāi)始從數(shù)字的最大值開(kāi)始螺旋"<<endl;
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++) ?//從左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i++;i<n-c;i++) // 從上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j--;j>=c;j--)//從右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i--;i>=c+1;i--)//從下到上
{
if(ou>z) ?break;
arrays[i][j] = ou--;
}
c++;
}
}
void getluoxuan2(int arrays[NMAX][NMAX])
{
cout<<"從矩陣的右上角開(kāi)始從數(shù)字1開(kāi)始螺旋:"<<endl;
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) ?//從右到左
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i++;i<n-c;i++) // 從上到下
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j++;j<n-c;j++)//從左到右
{
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i--;i>=c+1;i--)//從下到上
{
if(ou>z) ?break;
arrays[i][j] = ou++;
}
c++;
}
}
void getluoxuan22(int arrays[NMAX][NMAX])
{
cout<<"從矩陣的右上角開(kāi)始從矩陣的最大值開(kāi)始螺旋:"<<endl;
int c=0,i,j;
int z = n*n;
int ou=z;
while(ou>=1)
{
i=0;
j=0;
for(i=c,j=n-c-1;j>=c;j--) ?//從右到左
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j++,i++;i<n-c;i++) // 從上到下
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(i--,j++;j<n-c;j++)//從左到右
{
if(ou>z) break;
arrays[i][j] = ou--;
}
for(j--,i--;i>=c+1;i--)//從下到上
{
if(ou>z) ?break;
arrays[i][j] = ou--;
}
c++;
}
}
void diaplay(int arrays[NMAX][NMAX])
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",arrays[i][j]);
//cout<<arrays[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int arrays[NMAX][NMAX];
cin>>n;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
arrays[i][j] = 0;
cout<<"從外到內(nèi)螺旋,且數(shù)字從小到大,從矩陣的左上角開(kāi)始從數(shù)字1開(kāi)始螺旋:"<<endl;
getluoxuan1(arrays);
diaplay(arrays);
cout<<endl;
cout<<"從矩陣的右上角開(kāi)始從數(shù)字1開(kāi)始螺旋:"<<endl;
getluoxuan2(arrays);
diaplay(arrays);
cout<<endl;
cout<<"從矩陣的左上角開(kāi)始從數(shù)字的最大值開(kāi)始螺旋"<<endl;
getluoxuan11(arrays);
diaplay(arrays);
cout<<endl;
cout<<"從矩陣的右上角開(kāi)始從矩陣的最大值開(kāi)始螺旋:"<<endl;
getluoxuan22(arrays);
diaplay(arrays);
}
4階螺旋矩陣運(yùn)行結(jié)果:
5階螺旋矩陣運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的螺旋矩阵(c语言实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Win8系统的机器如何改装Win7系统
- 下一篇: iMobile与Online在线场景数据