我刚开始学习Java,我的代码也有一些问题。好吧,任务是得到一个数字并打印一个这样的矩阵:
get 3,and print:
1 2 3
8 9 4
7 6 5
get 4,and print:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
因为我是学习算法,所以我通过DFS处理问题,这是我的cpp代码,它可以解决任务。
#include "iostream"
using namespace std;
int n;
int matrix[100][100]={0};
int visited[100][100]={0};
void dfs(int n,int x,int y,int i,int dire)
{
//x,y is the coordinate,i is the number to write
//dire is the variety to control the direction of the dfs
if(i==n*n+1)return;
switch(dire)
{
case(1)://write the number on right
{
if(visited[x][y+1]==0&&y+1<n)
{
visited[x][y+1]=1;
matrix[x][y+1]=i;
i++;
dfs(n,x,y+1,i,1);
}
else dfs(n,x,y,i,2);
break;
}
case(2)://down
{
if(visited[x+1][y]==0&&x+1<n)
{
visited[x+1][y]=1;
matrix[x+1][y]=i;
i++;
dfs(n,x+1,y,i,2);
}
else dfs(n,x,y,i,3);
break;
}
case(3)://left
{
if(visited[x][y-1]==0&&y-1>=0)
{
visited[x][y-1]=1;
matrix[x][y-1]=i;
i++;
dfs(n,x,y-1,i,3);
}
else dfs(n,x,y,i,4);
break;
}
case(4)://up
{
if(visited[x-1][y]==0&&x-1>=0)
{
visited[x-1][y]=1;
matrix[x-1][y]=i;
i++;
dfs(n,x-1,y,i,4);
}
else dfs(n,x,y,i,1);
break;
}
}
}
void output(int n)
{
int p,q=0;
for(q=0;q<n;q++)
{
for(p=0;p<n;p++)
{
cout<<matrix[q][p]<<" ";
if(matrix[q][p]<10)
cout<<" ";
if(matrix[q][p]<100)
cout<<" ";
}
cout<<endl;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
matrix[i][j]=0;
visited[i][j]=0;
}
}
///dfs_r(n,0,-1,1);
dfs(n,0,-1,1,1);
output(n);
}
但是当我将其翻译成Java时出现问题
import java.util.Scanner;
public class mainclass{
public static class method{
int n;
int visited[][]=new int[n][n];
int matrix[][]=new int[n][n];
method(int temp){
n=temp;
}
void dfs(int x,int y,int i,int dire)
{
if(i==n*n+1)return;
switch(dire)
{
case(1):
{
if(visited[x][y+1]==0&&y+1<n)
{
visited[x][y+1]=1;
matrix[x][y+1]=i;
i++;
dfs(x,y+1,i,1);
}
else dfs(x,y,i,2);
break;
}
case(2):
{
if(visited[x+1][y]==0&&x+1<n)
{
visited[x+1][y]=1;
matrix[x+1][y]=i;
i++;
dfs(x+1,y,i,2);
}
else dfs(x,y,i,3);
break;
}
case(3):
{
if(visited[x][y-1]==0&&y-1>=0)
{
visited[x][y-1]=1;
matrix[x][y-1]=i;
i++;
dfs(x,y-1,i,3);
}
else dfs(x,y,i,4);
break;
}
case(4):
{
if(visited[x-1][y]==0&&x-1>=0)
{
visited[x-1][y]=1;
matrix[x-1][y]=i;
i++;
dfs(x-1,y,i,4);
}
else dfs(x,y,i,1);
break;
}
}
}
void output()
{
int p,q=0;
for(q=0;q<n;q++)
{
for(p=0;p<n;p++)
{
System.out.print(matrix[q][p]);
if(matrix[q][p]<10)
System.out.print(" ");
if(matrix[q][p]<100)
System.out.print(" ");
}
System.out.println();
}
}
}
public static void main(String args[]){
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
method c=new method(n);
c.dfs(0,-1,1,1);
c.output();
}
}
我认为我的算法没问题,但是我无法解决为什么我的Java代码崩溃了。我想我应该更多地了解Java的基本语法。
编辑: 我使用dev-cpp来运行我的cpp代码和eclipse来运行我的Java代码。我真的不知道如何描述Eclipse的崩溃是如何得到的,代码是:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at mainclass$method.dfs(mainclass.java:17)
at mainclass.main(mainclass.java:87)
<terminated, exit value: 1>C:\Program Files\Java\jre1.8.0_101\bin\javaw.exe (2016年9月27日 上午9:51:32)
答案 0 :(得分:1)
(答案是假设你有一个IDE,比如Eclipse)。
如果有疑问,你可以依靠一个好的旧System.out.println(yourobject)
。小心对象,永远不要忘记你可以将它们变成String
并检查内部对象(例如,在你的情况下,visited[1][2]
或matrix[2][0]
)。 但很糟糕。真。这可能足以满足您的需求,但这是一个不好的习惯。
使用名为SLF4J的工具获取一些额外的跟踪。由于你只是一个小方法,而不是一个完整的项目,我不会命令你部署这个工具,但请记住,这是一个很好的方法来弄清楚发生了什么,让你的控制台记录你需要的,特别是当项目变得有趣时(阅读:更大)。
了解一下名为debug mode
的工具。您可以找到更多帮助on the Eclipse help center,但基本上步骤如下:
debug
中运行您的程序。这是经典运行图标附近的一个小错误(多么方便)。您将被重定向到debug perspective
。ArrayOutOfBoundsException
并且由于这种良好的做法而成为一个更好的人。Vogella有一个good tutorial关于如何以一种很好的方式使用调试器。如果你打算继续使用Java,请学会使用它,因为这会为你节省很多时间(非常多,请相信我)。