uva 10422 ---Knights in FEN

简介: 点击打开链接 题目所属:  隐式图的搜索 题目意思:  给定一个5 x 5 的棋盘,棋盘上面有12个黑色的棋子和12个白色的棋子和一个空格, 最开始的这些棋子的位置是不定的, 要求我们找到最小的步数去把这个棋盘转化为最后的那个样子,最后输出。

点击打开链接


题目所属:  隐式图的搜索


题目意思:  给定一个5 x 5 的棋盘,棋盘上面有12个黑色的棋子和12个白色的棋子和一个空格, 最开始的这些棋子的位置是不定的, 要求我们找到最小的步数去把这个棋盘转化为最后的那个样子,最后输出。


解题思路:  我们容易相到的是直接bfs去搜索求出最小步数,但是这一题也可以用dfs+回溯做。首先我们开一个Fin数组用来保存最后的位置,然后就是我们对空格周围的8个方向进行一一的深搜回溯,我们每进行一次搜索就判断是否当前以及到达最后的位置(这个通过judge函数判断),如果是那么判断能否更新ans。其中我们还可以进行优化,就是对于Tans > 10的搜索肯定都是没用的那么我们就可以直接舍去。不用去开vis数组来标记是否走过 , 我们只要限制Tans 小于11即可,如果是Tans 大于10直接return.


代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;

int Fin[5][5] = {//保存最后的结果
    {1, 1, 1, 1, 1},
    {0, 1, 1, 1, 1},
    {0, 0, -1, 1, 1},
    {0, 0, 0, 0, 1},
    {0, 0, 0, 0, 0},
};
int dir[8][2] = {//方向数组
    {-2, -1},
    {-2, 1},
    {-1, 2},
    {1, 2},
    {2, 1},
    {2, -1},
    {1, -2},
    {-1, -2}
};
int G[5][5]; //保存输入的位置
char ch;
int t, ans;
struct Point {//坐标结构体
    int x;
    int y;
};

//判断是否到最后的位置
int judge(){
    for(int i = 0 ; i < 5 ; i++){
        for(int j = 0 ; j < 5 ; j++){
            if(G[i][j] != Fin[i][j])//只要有不像同的就return 0
                return 0;
        }
    }
    return 1;
}

//深搜回溯
void dfs(int x , int y , int Tans){//传入三个参数坐标以及步数
    if(Tans > 10) return;//大于10步的都不用搜索
    if(judge()){//如果这时候满足了,那么判断ans是否大于Tans
        if(ans > Tans) ans = Tans;
        return;
    }
    for (int i = 0; i < 8; i++) {//8个方向搜索
        if (dir[i][0]+x < 0 || dir[i][0]+x >= 5) continue;//越界就继续下一个方向 
        if (dir[i][1]+y < 0 || dir[i][1]+y >= 5) continue;//越界就继续下一个方向   
        swap(G[x][y] , G[dir[i][0]+x][dir[i][1]+y]);//将空格位置交换
        dfs(x+dir[i][0] , y+dir[i][1] , Tans+1);//递归继续搜索
        swap(G[x][y] , G[dir[i][0]+x][dir[i][1]+y]);//空格从新移回
    }
}

//主函数
int main() {
    scanf("%d%*c", &t);
    while (t--) {
        Point p;
        //处理输入
        for(int i = 0 ; i < 5 ; i++){
            for(int j = 0 ; j < 5 ; j++){
                if(j == 4) scanf("%c%*c" , &ch);
                if(j < 4)  scanf("%c" , &ch);
                if(ch == ' '){
                    G[i][j] = -1;
                    p.x = i ; p.y = j;
                }
                else G[i][j] = ch-'0';
            }
        }
        ans = 999999999; 
        dfs(p.x , p.y , 0);
        if (ans > 10)  printf("Unsolvable in less than 11 move(s).\n");
        else  printf("Solvable in %d move(s).\n", ans);
    }
    return 0;
}





目录
相关文章
|
编解码 Android开发 开发者
dp(相对大小) 和 px(像素)之间的相互转换
dp(相对大小) 和 px(像素)之间的相互转换
509 4
|
安全 物联网 测试技术
eSIM和物联网:挑战与机遇
eSIM在被广泛采用之前,有许多挑战需要克服。尽管有这么多好处,但在eSIM上全面投入使用之前,仍需要考虑一些事项。
809 0
eSIM和物联网:挑战与机遇
|
机器学习/深度学习 自然语言处理 BI
大模型技术在B端市场的三大引领
【1月更文挑战第15天】大模型技术在B端市场的三大引领
483 3
大模型技术在B端市场的三大引领
|
传感器 消息中间件 弹性计算
IoT设备接入基础(一)|学习笔记
快速学习IoT设备接入基础(一)
IoT设备接入基础(一)|学习笔记
《大型网站系统与Java中间件》读书笔记 (中)
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: 《大型网站系统与Java中间件》读书笔记(一) 这周周末读了第四章,现在过来做做笔记,希望能帮助到大家。
1311 49
|
机器学习/深度学习 Windows
raise RuntimeError(‘Error(s) in loading state_dict for {}:\n\t{}‘.format( RuntimeError: Error(s)..报错
即load_state_dict(fsd,strict=False) 属性strict;当strict=True,要求预训练练权重层数的键值与新构建的模型中的权重层数名称完全吻合;
2067 0
|
网络协议 调度
计算机考研408每日一题 day129
计算机考研408每日一题 day129
224 0
计算机考研408每日一题 day129
|
Python
Django 第三方引用富文本编辑器6.1
Django 第三方引用富文本编辑器6.1
254 0
Django 第三方引用富文本编辑器6.1
|
存储 Linux 编译器
《C语言深度剖析》第一章 关键字详解 p2 C语言从入门到入土(进阶篇)(一)
1.signed、unsigned 1.1整形在内存的存储 1.2signed(有符号数) 1.3unsigned(无符号数) 2 if else 组合 3 各种变量与“零值”进行比较 3.1 bool 变量与"零值"进行比较 3.2 float 变量与"零值"进行比较 3.3 指针变量与“零值”进行比较
《C语言深度剖析》第一章 关键字详解 p2 C语言从入门到入土(进阶篇)(一)