
正文
java蛇形矩阵代码大神 蛇形数组java
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java编程: 如何判断 二维数组 是否为蛇形矩阵?
先用下面的方法生个二维数组,再把你的跟他比较就行啦
public class SXjz {
/**
* @param args
*/
public static void main(String[] args) {
int g1[][]=getGrid(10);
for(int i=0;ig1.length;i++){
for(int j=0;jg1.length;j++){
System.out.print(g1[i][j]+" ");
}
System.out.println();
}
}
public static int[][] getGrid(int n)
{
int[][] array = new int[n][n];
int row = 0, col = 0, m = 1;
// 用于控制奇偶组,false表示偶组,true表示奇组
boolean isRow = false;
// i表示当前组的索引,从0开始
for (int i = 0; i (2 * n - 1); i++)
{
row = i;
while (row = ((i n) ? 0 : i - n + 1))
{
// 如果处理的是右下角表格中的数字,行或列最大不能超过n-1
if (row (n - 1))
row = n - 1;
col = i - row;
if (isRow)
array[row][col] = m;
else // 将row变成列,将col变成行
array[col][row] = m;
m++;
row--;
}
// 切换奇偶组
isRow = !isRow;
}
return array;
}
}
相关问答
Q1: ACM题目(倒蛇阵填数)求java解法
按照题目要求编写java蛇形矩阵代码大神的倒蛇形矩阵java蛇形矩阵代码大神的Java程序如下
import java.util.Scanner;
public class A {
public static void main(String[] args) {
int i,j,k,n,m,count=1;
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
while(N!=0){
if(N=10)
System.out.println("请输入小于10的正整数");
else{
int a[][]=new int[N][N];
if(N%2==0){
n=N/2;
}else{
n=N/2+1;
}
for(i=n-1;i=0;i--){
for(j=N-i-2;j=i+1;j--){
a[i][j]=count++;
}
for(j=i;jN-i;j++){
a[j][i]=count++;
}
k=N-i-1;
for(j=i+1;jN-i;j++){
a[k][j]=count++;
}
for(j=N-i-2;j=i;j--){
a[j][k]=count++;
}
}
for(i=0;iN;i++){
for(j=0;jN;j++){
System.out.printf("%-3d",a[i][j]);
}
System.out.println();
}
System.out.println();
}
N=sc.nextInt();
count=1;
}
}
}
运行结果
Q2: 用一个图形化界面实现蛇形矩阵,最好用Java语言!急!!!
public class SnakeMatrix {
private int[][] data;
private int index;
private int direct;
public static void main(String[] args) {
SnakeMatrix s = new SnakeMatrix(50);
s.print();
}
public SnakeMatrix(int i) {
if (i 1) {
System.out.println("参数错误");
System.exit(0);
}
index = i;
data = new int[i][i];
for (int j = 0; j i; j++) {
for (int k = 0; k i; k++) {
data[j][k] = 0;
}
}
direct = 0;
// manageData();
manageDataByMath();
}
public void manageDataByMath() {
for (int i = 0; i index; i++) {
for (int j = 0; j index; j++) {
data[i][j] = getDataByPosition(i, j);
}
}
}
public int getLevByPosition(int i, int j) {
int mid = (int) index / 2;
int tempi, tempj;
if ((i + 1) mid) {
tempi = index - i - 1;
} else {
tempi = i;
}
if ((j + 1) mid) {
tempj = index - j - 1;
} else {
tempj = j;
}
if (tempi tempj)
return tempi + 1;
return tempj + 1;
}
public int getDataByPosition(int i, int j) {
int lev = getLevByPosition(i, j);
// 每一层左上角第一个元素的值
int startIndex = 0;
// 计算这个值
for (int temp = 1; temp lev; temp++) {
startIndex += ((index - 2 * temp) * 4 + 4);
}
return startIndex + getAdd(i, j, lev) + 1;
}
public int getAdd(int i, int j, int lev) {
int add = 0;
// 每一层的边长
int levEdge = index - 2 * (lev - 1);
if (i + 1 == (index - (lev - 1))) {
// 这一层的倒数第一行
add = 2 * levEdge - 1 + (index - lev - 1 - j);
} else if (i + 1 == lev) {
// 这一层的第一行
add = j - lev + 1;
} else {// 中间行
if (j ((int) index / 2)) {
add = levEdge + i - lev;
} else {
add = levEdge + levEdge - 2 + levEdge + (index - lev - i - 1);
}
}
return add;
}
private void changeDirect() {
direct = (direct + 1) % 4;
}
private boolean check(int j, int k) {
if (direct == 0) {
if ((k + 1) == index) {
return false;
} else if (data[j][k + 1] != 0) {
return false;
}
} else if (direct == 1) {
if ((j + 1) == index) {
return false;
} else if (data[j + 1][k] != 0) {
return false;
}
} else if (direct == 2) {
if (k == 0) {
return false;
} else if (data[j][k - 1] != 0) {
return false;
}
} else {
if (j == 0) {
return false;
} else if (data[j - 1][k] != 0) {
return false;
}
}
return true;
}
public void manageData() {
int j = 0;
int k = 0;
data[j][k] = 1;
for (int i = 2; i index * index + 1; i++) {
// 判断能否合法赋值
while (!check(j, k)) {
changeDirect();
}
if (direct == 0) {
k++;
} else if (direct == 1) {
j++;
} else if (direct == 2) {
k--;
} else {
j--;
}
data[j][k] = i;
}
}
public void print() {
for (int i = 0; i index; i++) {
for (int j = 0; j index; j++) {
if (data[i][j] 10) {
} else if (data[i][j] 99) {
} else {
System.out.print(" " + data[i][j]);
}
}
System.out.println();
}
}
}
Q3: 以下蛇形矩阵用 "二维数组+循环" 打:
#includeiostream
using namespace std;
bool CreateMetrix(int *pMetrix,int n)
{
int i = 0, //数据元素
j = 0, //列号
k = 0;//行号
int iUp = 0,//上边界
iDown = n,//下边界
iLeft = 0,//左边界
iRight = n;//右边界
bool bRight = true,//左右填充方向
bDown = true;//上下填充方向
if (NULL == pMetrix)
{
return false;
}
memset(pMetrix,0,sizeof(int) * n*n);
//开始填充
for (i = 1; i = n*n; i++)
{
//首先向右填充
if (bRight)
{
if (j iRight)//还没有到达右边界
{
*(pMetrix + n * k + j) = i;
j++;
}
else
{
k++;//列号不变java蛇形矩阵代码大神,增加行号,因为上面已经填充了对应行java蛇形矩阵代码大神的列元素,故先将行号增加
if (k iDown)//还没有到最底端
{
*(pMetrix + n * k + (j - 1)) = i;//此处java蛇形矩阵代码大神的j是目前列号加1,因为上面的判断条件所致
}
else
{
iRight--;//右边界列号减1
iDown--;//下边界行号减1
k--;//行号减1
j--;//列号减1
bRight = false;//已经走完一个折线,接下来是向左填充了
}
}
}
if (!bRight)//向左填充
{
if (j iLeft)//如果还没有到达左边界
{
j--;//在前面已经把第k行第j列元素填充了
*(pMetrix + n * k + j) = i;
}
else
{
k--;//第k行元素已经填充
if (k iUp)//还没有到达最顶部
{
*(pMetrix + n * k + j) = i;
}
else
{
iLeft++;//左边界加1
iUp++;//上边界加1
k++;//k已经减过头了
j++;//j也见过头了
i--;//这时候这个数据没有被填充,所以回退一个
bRight = true;//下面又要向右填充了
}
}
}
}
return true;
}
void OutPutMetrix(int *Src, int n)
{
int t = 0;
for (int i = 0; i n; i ++)
{
for (int j = 0; j n; j++)
{
t = *(Src + n*i + j);
cout "\t" t;
}
cout endl;
}
}
int main()
{
int *p = NULL;
int n = 2;
cout "输入矩阵的维度:" endl;
cin n;
if (n 0)
{
p = new int[n*n];
}else
{
cout "输入数字有误java蛇形矩阵代码大神!\n本程序不能处理,再见!" endl;
return 0;
}
if (CreateMetrix(p,n))
{
OutPutMetrix(p, n);
}
else
{
cout "处理中出现错误,很抱歉。。。" endl;
}
delete p;
return 1;
}
PS:java蛇形矩阵代码大神你们的作业吗?这个题有点难度哦
java蛇形矩阵代码大神的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于蛇形数组java、java蛇形矩阵代码大神的信息别忘了在本站进行查找喔。







