您的位置:首页 > 编程语言 > Java开发

蓝桥杯-第七届蓝桥杯java B组决赛 路径之谜

2017-05-25 14:25 295 查看
路径之谜

小明冒充X星球的骑士,进入了一个奇怪的城堡。

城堡里边什么都没有,只有方形石头铺成的地面。

假设城堡地面是 n x n 个方格。【如图1.png】所示。

按习俗,骑士要从西北角走到东南角。

可以横向或纵向移动,但不能斜着走,也不能跳跃。

每走到一个新方格,就要向正北方和正西方各射一箭。

(城堡的西墙和北墙内各有 n 个靶子)

同一个方格只允许经过一次。但不必做完所有的方格。

如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?

有时是可以的,比如图1.png中的例子。

本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)

输入:

第一行一个整数N(0<N<20),表示地面有 N x N 个方格

第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)

第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)

输出:

一行若干个整数,表示骑士路径。

为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....

比如,图1.png中的方块编号为:

0  1  2  3

4  5  6  7

8  9  10 11

12 13 14 15

示例:

用户输入:

4

2 4 3 4

4 3 3 3

程序应该输出:

0 4 5 1 2 3 7 11 10 9 13 14 15

资源约定:
import java.util.Arrays;
import java.util.Scanner;

public class Main {
static int N;
static int north[],west[];
static int vis[][];
static int dir[][]={{0,-1},{0,1},{-1,0},{1,0}};
static int x,y;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
N=in.nextInt();
north=new int
;
west=new int
;
vis=new int

;

for(int i=0;i<N;i++)
north[i]=in.nextInt();
for(int i=0;i<N;i++)
west[i]=in.nextInt();
vis[0][0]=1;
dfs("0");
}
private static void dfs(String str) {
// TODO Auto-generated method stub
if(x>=N-1&&y>=N-1)
{
int countx[]=new int
;
int county[]=new int
;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
countx[i]+=vis[i][j];
county[j]+=vis[i][j];
}
}
if(Arrays.equals(north, county)&&Arrays.equals(countx, west))
{
System.out.println(str);
return;
}
}
for(int i=0;i<4;i++)
{
x+=dir[i][0];
y+=dir[i][1];
String s=str+" "+(N*x+y);
if(x>=0&&y>=0&&x<N&&y<N&&vis[x][y]==0)
{
vis[x][y]=1;
dfs(s);
vis[x][y]=0;
}
x-=dir[i][0];
y-=dir[i][1];
}
}
}


峰值内存消耗 < 256M

CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: