解题思路:

        DFS 核心代码,根据题意添加操作。

void DFS( 状态参数 ) {
    if ( 目的状态 ) {
     
        目的操作
        return;
    }
 
    for ( 搜索方式(移动) )
    {
        if ( 合法状态 ) {
         
            操作
            标记
             
            DFS( 更新状态参数 )
             
            回溯 ( 还原标记 )
        }
    }
}


注意事项:

        因为行字符间格了空格,所有沿着行搜索的时候步数需要 +2 个单位。

参考代码:

#include<bits/stdc++.h>
using namespace std;

char Map[105][105];              /*      保存图      */
bool vis[105][105] = { false };  /*   标记走过的点   */
int  map_size;                   /*     方阵大小     */
int  moveX[4] = { -1,0,1,0 };    /* 每一步移动的距离 */
int  moveY[4] = { 0,-2,0,2 };
int  minstep = 9999;

struct status {                  /*   保存当前位置   */
	int X, Y;
};

void DFS(int X, int Y, int step) {
	/*       走到出口比较步数       */
	if (Map[X][Y] == 'B') {
		if (step < minstep) minstep = step;
		return;
	}

	for (int i = 0; i < 4; i++) {
		status moving;
		/*      四个方向搜索        */
		moving.X = X + moveX[i];
		moving.Y = Y + moveY[i];
		/*         判断边界         */
		/*       判断是否走过       */
		/*       判断字符异同       */
		/* 特别注意Y < 2 * map_size */
		if (moving.X >= 0 && moving.Y >= 0 && moving.X < map_size &&
			moving.Y < map_size * 2 && vis[moving.X][moving.Y] != true &&
			Map[moving.X][moving.Y] != Map[X][Y]) {

			vis[moving.X][moving.Y] = true;
			DFS(moving.X, moving.Y, step + 1);
			/*       回溯状态       */
			vis[moving.X][moving.Y] = false;
		}
	}
}

int main() {
	cin >> map_size; cin.get();
	for (int i = 0; i < map_size; i++) {
		gets(Map[i]);
	}
	bool start = false;

	/*         寻找起点位置         */
	int position1, position2;
	for (position1 = 0; position1 < map_size; position1++) {
		for (position2 = 0; position2 < map_size; position2++)
			if (Map[position1][position2] == 'A') {
				start = true; break;
			}
		if (start == true) break;
	}
	/*             搜索             */
	vis[position1][position2] = true;
	DFS(position1, position2, 0);

	if (minstep == 9999) cout << -1 << endl;
	else cout << minstep << endl;
}


点赞(4)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

末日流光 3年前 回复TA
为什么加cin.get()之后,程序能够正常运行