#include <iostreamの> する#include <STDLIB.H> の#include <math.h>の 書式#include <アルゴリズム> 名前空間STDを使用して、 チャーSTS [50] [50]。 BOOL訪れた[50] [50]。 INT DFS(INT I、整数jを、INT X2、Y2 INT、INT、M、N INT)。 int型minValue4(int型SUM1、int型SUM2、int型SUM3、int型sum4)。 int型minValue3(int型SUM1、int型SUM2、int型SUM3)。 int型minValue2(int型SUM1、int型SUM2)。 INTのmain(){ int型M、N。 int型X1、Y1、X2、Y2; CIN >> M >> N。 CIN >> X1 >> Y1 >> X2 >> Y2; {(I ++; I <M INTがI = 0)するための ための(int型J = 0であり、j <N; J ++){ CIN >> STS [I] [J]。 訪問した[i] [j]は偽=。 } } int型の合計。 (STS [X1] [Y1] == '#'){もし 訪問[X1] [Y1] = TRUE; {}そうでなければ (!訪問[X1] [Y1]){もし 和= DFS(X1、Y1、X2、Y2、M、N)。 } } のprintf( "%dの\ n"は、合計)。 0を返します。 } INT DFS(INT I、整数jを、INT X2、Y2 INT、INT、M、N INT){ 訪問[i] [j]は真=。 もし(私== X2 && J == Y2)の戻り0; INT SUM1 = 0、SUM2 = 0、SUM3 = 0、sum4 = 0。 IF(I + 1 <M && STS [I + 1] [j] == '' &&訪問[I + 1] [j] ==偽){ SUM1 = 1 + DFS(I + 1、J、X 2、 Y2、M、N)。 } } IF(J + 1 <N && STS [I]、[J + 1] == '' SUM2 = 1 + DFS(I、J + 1、X2、Y2、M、N)。 IF(I - 1> = 0 && STS [I - 1]〜[J] == &&訪問[I-1]〜[J] ==偽''){ SUM3 = 1 + DFS(I - 1、J、X2 、Y2、M、N)。 } ( - 1> = 0 && STS [I]、[J - 1] '' J == &&訪問[I]、[J-1] ==偽)なら、{ 1 - sum4 = 1 + DFS(I、J X2、Y2、M、N)。 } minValue4(SUM1、SUM2、SUM3、sum4)を返します。 //戻り分(分(SUM1、SUM2)、分(SUM3、sum4))。 } minValue4 INT(INT SUM1、SUM2 INT、INT SUM3、INT sum4){ IF(SUM1 == 0){ リターンminValue3(SUM2、SUM3、sum4)。 }そうであれば(SUM2 == 0){ リターンminValue3(SUM1、SUM3、sum4)。 }そうであれば(SUM3 == 0){ minValue3(SUM1、SUM2、sum4)を返します。 }他{ 戻りSUM1。 } minValue3(SUM1、SUM2、SUM3)を返します。 }他{ 戻り分(分(SUM1、SUM2)、分(SUM3、sum4))。 } } int型minValue3(INT SUM1、SUM2 INT、INT SUM3){ IF(SUM1 == 0){ リターンminValue2(SUM2、SUM3)。 }そうであれば(SUM2 == 0){ リターンminValue2(SUM1、SUM3)。 }そうであれば(SUM3 == 0){ リターンminValue2(SUM1、SUM2)。 } {他 戻り分(SUM1、分(SUM2、SUM3))。 } } int型minValue2(INT SUM1、SUM2 INT){ IF(SUM1 == 0){ 戻りSUM2。 }