【luogu P2324 [SCOI2005]骑士精神】 题解

题目链接:https://www.luogu.org/problemnew/show/P2324

不懂怎么剪枝,所以说,,我需要氧气。。

第一道A*

 1 // luogu-judger-enable-o2
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6 #define maxn 10
 7 using namespace std;
 8 int T, ans = 16, mx, sx, sy;
 9 int aim[6][6] = {{0,0,0,0,0,0},
10                  {0,2,2,2,2,2},
11                  {0,1,2,2,2,2},
12                  {0,1,1,0,2,2},
13                  {0,1,1,1,1,2},
14                  {0,1,1,1,1,1}};
15 int dx[8] = {-2,-1,1,2,2,1,-1,-2};
16 int dy[8] = {1,2,2,1,-1,-2,-2,-1};
17 int a[maxn][maxn];
18 inline int h()
19 {
20     int ret = 0;
21     for(int i = 1; i <= 5; i++)
22     for(int j = 1; j <= 5; j++)
23     if(a[i][j] != aim[i][j]) ret++;
24     return ret;
25 }
26 inline bool move(int x, int y)
27 {
28     if(x >= 1 && x <= 5 && y >= 1 && y <= 5) return true;
29     return false;
30 }
31 void A_star(int now, int x, int y)
32 {
33     if(now > mx) return;
34     int cnt = h();
35     if(cnt == 0)
36     {
37         ans = min(ans, now);
38         return;
39     }
40     if(cnt + now - 1 > mx) return;
41     int nowx, nowy;
42     for(int i = 0; i <= 7; i++)
43     {
44         nowx = x + dx[i];
45         nowy = y + dy[i];
46         if(move(nowx, nowy))
47         {
48             swap(a[nowx][nowy],a[x][y]);
49             A_star(now+1,nowx,nowy);
50             swap(a[nowx][nowy],a[x][y]);
51         }
52     }
53 }
54 int main()
55 {
56     cin.sync_with_stdio(false);
57     cin>>T;
58     while(T--)
59     {
60         char s;
61         ans = 16;
62         memset(a,0,sizeof(a));
63         for(int i = 1; i <= 5; i++)
64         for(int j = 1; j <= 5; j++)
65         {
66             cin>>s;
67             if(s != ‘*‘)
68             a[i][j] = s + 1 - ‘0‘;
69             if(s == ‘*‘)
70             {
71                 a[i][j] = 0;
72                 sx = i;
73                 sy = j;
74             }
75         }
76         for(mx = 1; mx <= 15; mx++)
77         {
78             A_star(0,sx,sy);
79             if(ans == mx) break;
80
81         }
82         if(ans == 16)
83         {
84             cout<<-1<<endl;
85         }
86         else
87         {
88             cout<<ans<<endl;
89         }
90     }
91     return 0;
92 }

原文地址:https://www.cnblogs.com/MisakaAzusa/p/9004653.html

时间: 2024-10-24 21:02:58

【luogu P2324 [SCOI2005]骑士精神】 题解的相关文章

洛谷 P2324 [SCOI2005]骑士精神

P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式: 对于每组数据都输出一行.如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1. 输入输出样例 输入样例#1: 2 10110 01*11 10111 01001 00000 01011 110*1 01110 01010 00100 输出样例

BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解

http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10)

【题解】P2324 [SCOI2005]骑士精神

·有关IDA* 是带有估值函数的迭代加深搜索,表现出出色的效率. 估值函数可以简单的定义为「已经到位的骑士的个数」. 然后就是普通的迭代加深了. 算法酷炫不一定赢,搜索好才是成功. ——Loli Code: #include <iostream> #include <math.h> #include <stdio.h> #include <algorithm> #include <string.h> #include <fstream>

P2324 [SCOI2005]骑士精神

题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式: 对于每组数据都输出一行.如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1. 输入输出样例 输入样例#1: 复制 2 10110 01*11 10111 01001 00000 01011 110*1 01110 01010 00100 输出样例#1: 复制 7 -1 说明 很显然

【bzoj1085】[SCOI2005]骑士精神

1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变

bzoj1085 [SCOI2005]骑士精神

1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 1422[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动

BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* ------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i

Bzoj 1085: [SCOI2005]骑士精神 (dfs)

Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: 1.每次交换只能改变一个位置.若发现之间相差的步数加上以前走的步数大于15的话,直接舍弃这一状态. 2.初始时,\(ans\)设为\(16\) 有了上面两个剪枝就A了. 照这节奏,SCOI2005就刷完了??? #include <iostream> #include <cstdio>

[SCOI2005]骑士精神

题目描述:在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空 位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步 数完成任务. 题解: IDA* 搜索. 非常友好. 代码: #include<cstdio> #include<cstring> #include<algo