小提示:部分题目的图形有偏移现象;解决办法为,将题目拷贝到记事本,字体设置为‘Fixedsys’。
(编译环境:windowsXP_sp3 + Visual_C++_2008,保证编译成功,正常运行。)
6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:
① 倒填,例如N=5 ② 蛇形填数 ③ 回转填数
┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐
│25│24│23│22│21│ │ 1│ 3│ 4│10│11│ │ 1│16│15│14│13│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│20│19│18│17│16│ │ 2│ 5│ 9│12│19│ │ 2│17│24│23│12│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│15│14│13│12│11│ │ 6│ 8│13│18│20│ │ 3│18│25│22│11│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│10│ 9│ 8│ 7│ 6│ │ 7│14│17│21│24│ │ 4│19│20│21│10│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
│ 5│ 4│ 3│ 2│ 1│ │15│16│22│23│25│ │ 5│ 6│ 7│ 8│ 9│
└─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘
代码如下:
#include<iostream>
using namespace::std;
void Reverse();
void Snake();
void Circum();
void Output();
int N, n;
int** a;
void main()
{
while(1)
{
cout<<"请输入方形二维数组的N值"<<endl;
cin>>N;
cin.clear();
cin.sync();
if(N>0)
{
break;
}
else
{
cout<<"输入无效,请重新输入"<<endl;
}
}
a = new int* [N];
for(int i=0;i<N;i++)
a[i]= new int [N];
cout<<"请输入您想要的填数方式:(输入序号)"<<endl;
cout<<"1.倒填"<<endl;
cout<<"2.蛇形填数"<<endl;
cout<<"3.回转填数"<<endl;
while(1)
{
cin>>n;
cin.clear();
cin.sync();
if(n==1||n==2||n==3)
{
break;
}
else
{
cout<<"输入无效,请重新输入"<<endl;
}
}
switch (n)
{
case 1:
Reverse();Output();break;
case 2:
Snake();Output();break;
case 3:
Circum();Output();break;
default:
{
}
}
system("pause");
}
void Reverse()
{
int k=1;
for(int i=N-1;i>=0;i--)
for(int j=N-1;j>=0;j--)
a[i][j]=k++;
}
void Snake()
{
int i=1, j=0, k=2;
a[0][0]=1;
a[N-1][N-1]=N*N;
while(!(i==(N-1)&&j==(N-1)))
{
if(j==0||i==(N-1)&&j!=(N-1))
{
for(;i>=0&&j<=N-1;i--,j++)
a[i][j] = k++;
if(i<0&&j<=N-1)
i++;
else
{
i=i+2;j--;
}
}
if(i==0||j==(N-1)&&i!=(N-1))
{
for(;i<=N-1&&j>=0;j--,i++)
a[i][j] = k++;
if(j<0&&i<=N-1)
j++;
else
{
j=j+2;i--;
}
}
}
}
void Circum()
{
int i=0,j=0,k=1;
int M = N;
while(M)
{
for(i=i;i<M;i++)
{
a[i][j]=k++;
}
j++;i--;
for(j=j;j<M;j++)
{
a[i][j]=k++;
}
i--;j--;
for(i=i;i>=N-M;i--)
{
a[i][j]=k++;
}
j--;i++;
for(j=j;j>i;j--)
{
a[i][j]=k++;
}
i++;j++;
M--;
}
}
void Output()
{
cout<<"矩阵填好后,结果如下:"<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
cout<<a[i][j]<<"/t";
cout<<endl<<endl;
}
}