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





目录
相关文章
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第22天】随着Kotlin在Android开发中的普及,开发者们对其性能表现持续关注。本文通过深入分析Kotlin与Java在Android平台上的执行效率,揭示了二者在编译优化、运行时性能以及内存占用方面的差异。通过实际案例测试,为开发者提供选择合适编程语言的参考依据。
386 0
|
JSON JavaScript 前端开发
一篇文章讲明白json文件格式详解
一篇文章讲明白json文件格式详解
640 2
|
网络协议 安全 Linux
Linux的netns使用总结
Linux的netns(Network Namespace)是一项强大的网络隔离功能,可在内核层面创建多个独立的网络空间,每个空间配备独立的网络协议栈,包括接口、路由表及iptables规则等,确保不同应用或服务在网络环境中互不干扰,提升系统安全性和灵活性。通过`ip netns`命令可轻松管理netns,实现创建、删除及执行命令等功能。netns适用于容器技术、虚拟化环境及网络测试等多种场景,为用户提供高效、安全的网络环境管理方案。
1534 3
|
编解码 Android开发 开发者
dp(相对大小) 和 px(像素)之间的相互转换
dp(相对大小) 和 px(像素)之间的相互转换
528 4
|
云安全 缓存 安全
CleanMyMac X4.12.5电脑Mac系统优化软件最新版本
CleanMyMac X可以优化Mac系统。mac系统用久了,用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件,还能卸载应用程序。小编给您带来cleanmymac中文版,CleanMyMac是一款Mac系统清理优化工具,使用只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间,欢迎大家前来下载!
374 0
|
传感器 消息中间件 弹性计算
IoT设备接入基础(一)|学习笔记
快速学习IoT设备接入基础(一)
IoT设备接入基础(一)|学习笔记
|
搜索推荐 算法
归并排序(递归+非递归)
归并排序(递归+非递归)
208 0
|
机器学习/深度学习 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,要求预训练练权重层数的键值与新构建的模型中的权重层数名称完全吻合;
2086 0
|
Python
Django 第三方引用富文本编辑器6.1
Django 第三方引用富文本编辑器6.1
270 0
Django 第三方引用富文本编辑器6.1
|
NoSQL 关系型数据库 MongoDB
Docker部署安装MongoDB数据库
Docker部署安装MongoDB数据库
1744 0