jzxx1925【基础】走迷宫 DFS

1925: 【基础】走迷宫

时间限制: 1 Sec  内存限制: 32 MB
提交: 234  解决: 110
[提交][状态][讨论版]

题目描述

迷宫由N*N个方格组成,每个方格均被组织者事先标上了“0”或“1”(左上角第一个方格和右下角最后一个方格一定是“0”)。当你进入左上角的第一个方格中时,看到相邻的方格是“0”时则可以进入,而如果是“1”时则表示此路不通。兔兔被告之:从迷宫的左上角第一个方格的入口处准备进入时,你可得到一个记有N*N分值的记分表,每经过一个标有“0”的方格,记分表将自动扣去1分,当走到右下角最后一个方格的出口处时,将显示你手中的记分表剩余的分值。夏令营的组织者将只奖励所有参加此项活动中,记分表剩余的分值最多的营员。

输入

第一行是一个整数N(3≤N≤40),接下来有N行,每行均有N个由0 和1组成的数据

输出

包括一个整数(记分表剩余的分值)

样例输入

4
0011
1000
0001
1000

样例输出

9
 
 
const
    dx:array[1..4] of longint=(1,0,-1,0);
    dy:array[1..4] of longint=(0,1,0,-1);
var
    x,y,step,i,j,n:longint;
    a:array[0..110,0..110] of longint;
    c:char;
procedure DFS(x,y,s:longint);
var i:longint;
begin
    //找到出口,发现一种走法,打擂台
    if (x=n)and(y=n) then
    begin
        if s<step then step:=s;
        exit;
    end;
    a[x,y]:=1;
    //向四个方向依次搜索
    for i:=1 to 4 do
        if a[x+dx[i],y+dy[i]]=0 then DFS(x+dx[i],y+dy[i],s+1); 
    a[x,y]:=0;
end;
 
begin
    readln(n);
    //加墙,防越界
    for i:=0 to n+1 do
        for j:=0 to n+1 do
            a[i,j]:=1;
    for i:=1 to n do
    begin
        for j:=1 to n do
        begin
            read(c);
            if c='0' then a[i,j]:=0 else a[i,j]:=1;
        end;
        readln;
    end;
    step:=maxlongint;
    DFS(1,1,1);
    writeln(n*n-step);
end.

 

 
posted @ 2015-06-04 22:57  qilinart  阅读(312)  评论(0)    收藏  举报