HzuWHF


私信TA

用户名:I7I08I9047

访问量:76349

签 名:

我RUN了

等  级
排  名 18
经  验 20440
参赛次数 13
文章发表 127
年  龄 3
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

解题思路:

        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;
}


 

0.0分

8 人评分

  评论区

为什么加cin.get()之后,程序能够正常运行
2021-04-01 17:53:04
  • «
  • 1
  • »