面试题 打印方阵5*5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
用java如何实现啊???? 希望大家帮忙,谢谢了!!!!!
这样写那里不对?????
import java.util.Scanner;
public class Test55fangzhen {
public static void main(String[] args) {
int[][] a=new int[5][5];
int i,j,k=0,m,n;
Scanner in=new Scanner(System.in );
System.out.println( "name ");
n=in.nextInt();
if(n%2==0)m=n/2;
else m=n/2+1 ;
for(i=0;i <m;i++){
for(j=i;j <n;j++){k++;a[i][j]=k;}
for(j=i+1;j <n-i;j++){k++;a[i][j]=k;}
for(j=n-i-2;j> =i;j--){k++;a[n-i-1][j]=k;}
for(j=n-i-2;j> =i;j--){k++;a[j][i]=k;}
}
for(i=0;i <a.length;i++)
{ for(j=0;j <a[1].length;j++)
System.out.print( "\t "+a[i][j]);
System.out .println();
}
}
}
[解决办法]
http://community.csdn.net/Expert/TopicView3.asp?id=5323590
呵呵,好象很多人问这类问题.
还有for循环尽量少套几层,
想别的办法代替,
要不容易出现溢出问题.
:)
[解决办法]
public class Turner {
public final int right=1;
public final int down=2;
public final int left=3;
public final int up=4;
public void printSnake(int n,int type) {
int legs=(int) Math.sqrt(n);
int[][] snake=new int[legs][legs];
for(int j=0; j <legs; j++)
for(int k=0; k <legs; k++)
snake[j][k]=0;
int i=0;
int direct=0;
int x=0;
int y=0;
if(type==1)
direct=right;
else
direct=down;
while(i <n) {
i++;
snake[y][x]=i;
if(type==1) {
if((direct==right && x==legs-1) ||(direct==right && snake[y][x+1]> 0))
direct=down;
if((direct==down && y==legs-1) || (direct==down && snake[y+1][x]> 0))
direct=left;
if((direct==left && x==0) || (direct==left && snake[y][x-1]> 0))
direct=up;
if((direct==up && y==0) || (direct==up && snake[y-1][x]> 0))
direct=right;
} else {
if((direct==right && x==legs-1) ||(direct==right && snake[y][x+1]> 0))
direct=up;
if((direct==down && y==legs-1) || (direct==down && snake[y+1][x]> 0))
direct=right;
if((direct==left && x==0) || (direct==left && snake[y][x-1]> 0))
direct=down;
if((direct==up && y==0) || (direct==up && snake[y-1][x]> 0))
direct=left;
}
if(direct==right)
x++;
if(direct==down)
y++;
if(direct==left)
x--;
if(direct==up)
y--;
}
for(int j=0; j <legs; j++) {
for(int k=0; k <legs; k++)
System.out.print(snake[j][k]+ "\t ");
System.out.println();
}
}
public static void main(String[] args) {
new Turner().printSnake(5*5,2);
}
}
以前写的方法,类似于贪吃蛇行走路线,有2个参数,第二个参数为1时是顺时针,其他时是逆时针。
[解决办法]
lz 的算法收藏了,不知道O(g(n))是什么级别的。
[解决办法]
package test;
public class FiveSquare {
private int direction;
private int[] array;
private int side;// 正方形边的大小
public FiveSquare(int side) {
array = new int[side * side];
this.side = side;
direction = 0;// 向右
}
public void fill() {
int site = 0;
int next = 0;
for (int i = 1; i <= side * side; i++) {
boolean goNext = true;
array[site] = i;
if (i == side * side)
break;
switch (direction) {
// 向右这种情况
case 0:
next = site + 1;
if (next % side == 0 || array[next] != 0)
goNext = false;
break;
// 向下这种情况
case 1:
next = site + side;
if (next > = side * side || array[next] != 0)
goNext = false;
break;
// 向左
case 2:
next = site - 1;
if ((next + 1) % side == 0 || array[next] != 0)
goNext = false;
break;
// 向上
case 3:
next = site - side;
if (next <= 0 || array[next] != 0)
goNext = false;
break;
default:
break;
}
if (goNext) {
site = next;
} else {
direction = (direction + 1) % 4;
i--;
}
}
}
public void printOut() {
for (int i = 0; i < side; i++) {
for (int j = 0; j < side; j++) {
int current = array[i * side + j];
String cur = Integer.toString(current);
if (cur.length() == 1)
cur = " " + cur;
System.out.print(cur + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
FiveSquare square = new FiveSquare(5);
square.fill();
square.printOut();
}
}
[解决办法]
这个叫螺旋矩阵,:),网上有很多种方法,不过都差不多,:)
[解决办法]
,
[解决办法]
public static void main(String[] args) {
int[][] xy = new int[5][5];
int x = 0, y = 0;
int tx = 1, ty = 0;
int maxx = 4, minx = 0;
int maxy = 4, miny = 1;
for (int n = 1; n <= 25; n++) {
xy[y][x] = n;
if (tx > 0 && x > = maxx) {
x = maxx;
ty = 1;
tx = 0;
maxx--;
}
else if (tx < 0 && x <= minx) {
x = minx;
tx = 0;
ty = -1;
minx++;
}
else if (ty > 0 && y > = maxy) {
y = maxy;
tx = -1;
ty = 0;
maxy--;
}
else if (ty < 0 && y <= miny) {
y = miny;
tx = 1;
ty = 0;
miny++;
}
x += tx;
y += ty;
}
for (int i = 0; i < 5; i ++) {
for (int j = 0; j < 5; j++) {
System.out.printf( "%02d ",xy[i][j]);
}
System.out.println();
}
}
[解决办法]
嘎嘎,不知道这样写算不算精致HOHO:
public class Test{
public static void main(String[] args){
int[][] data=new int[5][5];
int i=0,j=0,ccnt=0,iway=1,jway=0;
while(ccnt++ <=data.length*data[0].length){
data[i][j]=ccnt;
if(i+iway <0||i+iway> 4||j+jway <0||j+jway> 4||data[i+iway][j+jway]!=0){
if(iway==0){
iway=-1*jway;
jway=0;
}else{
jway=iway;
iway=0;
}
}
i+=iway;
j+=jway;
}
for(int n=0;n <5;n++){
for(int m=0;m <5;m++){
if(data[m][n] <10) System.out.print( " ");
System.out.print(data[m][n]+ " ");
}
System.out.println();
}
}
}
[解决办法]
顶
[解决办法]
都是高手
[解决办法]
收藏```
参考```
[解决办法]
学习
拿分
[解决办法]
System.out.println( " 1 2 3 4 5\n ");
System.out.println( "16 17 18 19 6\n ");
System.out.println( "15 24 25 20 7\n ");
System.out.println( "14 23 22 21 8\n ");
System.out.println( "13 12 11 10 9\n ");
[解决办法]
哈哈, 可能大家想复杂了, puppy52020 这个高级
[解决办法]
puppy52020() 有前途!
[解决办法]
我觉得我的算法简单:
public class Test55 {
int[][] squar=new int[5][5];
void print(){
for(int i=0;i <5;i++){
for(int j=0;j <5;j++){
System.out.print(squar[i][j]+ "\t ");
}
System.out.println();
}
}
void generate(){
int dx=1,dy=1,x=0,y=0,_x,_y;
boolean goHorizon=true;
for(int i=1;i <=25;i++){
squar[y][x]=i;
if(goHorizon){
_x=x+dx;
if( _x> 4 || _x <0 || squar[y][_x]!=0 ){
goHorizon=false;
dx=-dx;
y+=dy;
}
else{
x=_x;
}
}
else{
_y=y+dy;
if( _y> 4 || _y <0 || squar[_y][x]!=0 ){
goHorizon=true;
dy=-dy;
x+=dx;
}
else{
y=_y;
}
}
}
}
public static void main(String[] args){
Test55 test=new Test55();
test.generate();
test.print();
}
}
[解决办法]
System.out.println( " 1 2 3 4 5\n ");
System.out.println( "16 17 18 19 6\n ");
System.out.println( "15 24 25 20 7\n ");
System.out.println( "14 23 22 21 8\n ");
System.out.println( "13 12 11 10 9\n ");
--------------------------------------
我靠。新时代的人才。。。-_-#
也许是正确的哦。。。呵呵。。
[解决办法]
循环保存到数组后再输出
[解决办法]
高手,学习中。
[解决办法]
Java不会,下面是在Asp.net下的C#代码(二者差不多):
private static int [,] intArray = new int[5,5];
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
/*
* 打印螺旋矩陣
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
* */
//int [,] intArray = new int[5,5];
//初始化数据0
for(int i=0;i <5;i++)
{
for(int j=0;j <5;j++)
{
intArray[i,j] = 0;
}
}
string str = "右 ";//左上右下
int m = 0;
int n = 0;//当前的位置下标
for(int i=1;i <=25;i++)
{
//左
zuo:if(str == "左 ")
{
if(IsOk(m,n))
{
intArray[m,n] = i;
n--;
}
else
{
m--;
n++;
str = "上 ";
}
}
//上
if(str == "上 ")
{
if(IsOk(m,n))
{
intArray[m,n] = i;
m--;
}
else
{
m++;
n++;
str = "右 ";
}
}
//右
if(str == "右 ")
{
if(IsOk(m,n))
{
intArray[m,n] = i;
n++;
}
else
{
m++;
n--;
str = "下 ";
}
}
//下
if(str == "下 ")
{
if(IsOk(m,n))
{
intArray[m,n] = i;
m++;
}
else
{
n--;
m--;
str = "左 ";
goto zuo;
}
}
}
//打印数据
for(int i=0;i <5;i++)
{
for(int j=0;j <5;j++)
{
Response.Write(intArray[i,j].ToString() + " ");
}
Response.Write( " <br> ");
}
}
//试试可不可以写入新的数值
private bool IsOk(int j,int k)
{
//超介或对应的位置不为0,返回false,否则return true;
if(j <0 || 4 <j)
{
return false;
}
if(k <0 || 4 <k)
{
return false;
}
if(intArray[j,k]==0)
{
return true;
}
else
{
return false;
}
}