/*作者:郑云飞
*创建日期:2010年6月16日下午17:51
*内容:任意行和列的顺时针蛇形矩阵
*/
import java.io.*;
public class snake3
{
public static void main(String[] args) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入蛇形矩阵的行数:");
String str=br.readLine();
System.out.println("请输入蛇形矩阵的列数:");
String str1=br.readLine();
int m=Integer.parseInt(str);//输入的行数
int n=Integer.parseInt(str1);//输入的列数
int k=1;//声明一个累加器
int [][]a=new int [m][n];//声明一个二维数组
for(int i=0;i<min(m,n)/2;i++)//控制蛇形矩阵的环绕的圈数
{
for(int j=i;j<n-i;j++)//遍历最上面一行
a[i][j]=k++;//为最上面一行赋值
for(int j=i+1;j<m-i;j++)//遍历最右边一行
a[j][n-i-1]=k++;//为最右边一行赋值
for(int j=n-i-2;j>=i;j--)//遍历最下边一行
a[m-i-1][j]=k++;//为最下边一行赋值
for(int j=m-i-2;j>i;j--)//遍历最左边一样
a[j][i]=k++;//为最左边一行赋值
}
if(min(m,n)%2==1)//如果输入的值有基数
a[min(m,n)/2][min(m,n)/2]=k++;//为最后一圈开始的一个数赋值
/*此时如果不写下面的代码,通过运行结果可以得知,最后面还有Math.abs(m-n)个连续的数还没有赋值
* */
if(m==min(m,n))//如果行数小于列数 为最后一圈那一行的Math.abs(m-n)个连续的数赋值
{
for(int i=0;i<Math.abs(m-n);i++)//控制赋值的个数
{
a[min(m,n)/2][min(m,n)/2+i+1]=k++;//为没可有赋值的数赋值
}
}
if(n==min(m,n))//如果列数小于行数,那么就为最后一圈那一列的Math.abs(m-n)个连续的数赋值
{
for(int i=0;i<Math.abs(m-n);i++)//控制赋值的个数
{
a[min(m,n)/2+i+1][min(m,n)/2]=k++;//为没有赋值的数赋值
}
}
for(int i=0;i<m;i++)//输出结果
{
for(int j=0;j<n;j++)
{
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
public static int min(int a,int b)//定义一个求最小值的方法
{
return a<b?a:b;
}
}
任意形状的顺时针环绕的蛇形矩阵
最新推荐文章于 2022-01-05 16:35:19 发布