/**
* 枚举类:转角方向
* @author Administrator
*
*/
public enum Direction {
right,
down,
left,
up
}
import java.util.Scanner;
public class Help {
/**
* 处理用户输入不合法的异常
* @return
*/
public int inputNum()
{
Scanner s = new Scanner(System.in);
int num = 0;
try {
num = s.nextInt();
} catch (Exception e) {
//System.out.println(e);
System.out.print("输入的值不合法:请重新输入:");
num = inputNum();//递归调用
}
return num;
}
}
public class Pointer {
public int x;
public int y;
public Direction dire;
/**
* 在某一个转角点,为了继续前行,是否已尝试过改变方向
*/
public boolean isChangeDirection;
/**
*
* @param x:横坐标
* @param y:纵坐标
* @param dire:移动方向
* @param ischange 是否曾改变过方向
*/
public Pointer(int x, int y,Direction dire,boolean ischange){
this.x=x;
this.y=y;
this.dire=dire;
this.isChangeDirection=ischange;
}
}
public class EndResult {
public static void main(String[] args) {
System.out.print("请输入你要输入的宫格的行数:");
int rows = new Help().inputNum();
System.out.print("请输入你要输入的宫格的列数:");
int cols=new Help().inputNum();
//创建二维数组保存格式
int[][] nums=new int[rows][cols];
//给左上角赋初始值
nums[0][0]=1;
/*先由左上角向右移动*/
Pointer p=new Pointer(0,0,Direction.right,false);
/*循环到指针不能移动为止*/
while(moveNext(p,nums)){
}
printnums(nums);//输出结果
}
/**
* 打印输出结果
*/
public static void printnums(int[][] nums){
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
}
/**
* @param p 指针移动的方向
* @param nums 传入的宫格格式
* @return 是否移动过方向:若移动过或者遇到阻碍返回false
*/
public static boolean moveNext(Pointer p, int[][] nums){
if(p.dire==Direction.right){
if(p.x==nums[0].length - 1||nums[p.y][p.x+1]!=0){
//右边受到阻碍(边界或已有值)
if(p.isChangeDirection){
return false;
}
else{
p.dire=Direction.down;
p.isChangeDirection=true;
return moveNext(p,nums);
}
}
else{
p.x++;//没有阻碍继续前行
nums[p.y][p.x]=nums[p.y][p.x-1]+1;
p.isChangeDirection=false;
return true;
}
}
else if(p.dire==Direction.down){
if(p.y==nums.length - 1||nums[p.y+1][p.x]!=0){
//下边受到阻碍(边界或已有值)
if(p.isChangeDirection){
return false;
}
else{
p.dire=Direction.left;
p.isChangeDirection=true;
return moveNext(p,nums);
}
}
else{
p.y++;//没有阻碍继续前行
nums[p.y][p.x]=nums[p.y -1][p.x]+1;
p.isChangeDirection=false;
return true;
}
}
else if(p.dire==Direction.left){
if(p.x==0||nums[p.y][p.x-1]!=0){
//左边受到阻碍(边界或已有值)
if(p.isChangeDirection){
return false;
}
else{
p.dire=Direction.up;
p.isChangeDirection=true;
return moveNext(p,nums);
}
}
else{
p.x--;//没有阻碍继续前行
nums[p.y][p.x]=nums[p.y][p.x+1]+1;
p.isChangeDirection=false;
return true;
}
}
else{
if(p.y==0||nums[p.y-1][p.x]!=0){
//上边受到阻碍(边界或已有值)
if(p.isChangeDirection){
return false;
}
else{
p.dire=Direction.right;
p.isChangeDirection=true;
return moveNext(p,nums);
}
}
else{
p.y--;//没有阻碍继续前行
nums[p.y][p.x]=nums[p.y+1][p.x]+1;
p.isChangeDirection=false;
return true;
}
}
}
}