[BZOJ1085][SCOI2005]骑士精神 搜索

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085

大的思路是迭代加深搜索,我们加一个明显的剪枝,当棋盘中位置不对的骑士的数目加上已经走的步数大于了限制的深度,就直接结束,然后……xjb搜就行了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int dx[]={-2,-1,1,2,2,1,-1,-2};
 6 const int dy[]={1,2,2,1,-1,-2,-2,-1};
 7 int T[10][10];
 8 int g[10][10],mx;
 9 bool inline cmp(){
10     for(int i=1;i<=5;i++)
11         for(int j=1;j<=5;j++)
12             if(g[i][j]!=T[i][j])
13                 return false;
14     return true;
15 }
16 bool eva(int k){
17     int cnt=0;
18     for(int i=1;i<=5;i++)
19         for(int j=1;j<=5;j++){
20             cnt+=g[i][j]!=T[i][j];
21             if(cnt+k>mx) return false;
22         }
23     return true;
24 }
25 bool dfs(int k,int x,int y){
26     if(x==3&&y==3&&cmp()) return true;
27     if(k>mx) return false;
28     for(int i=0;i<=7;i++){
29         int tx=x+dx[i],
30             ty=y+dy[i];
31         if(tx>=1&&ty>=1&&tx<=5&&ty<=5){
32             swap(g[tx][ty],g[x][y]);
33             if(eva(k-1)&&dfs(k+1,tx,ty)) return true;
34             swap(g[tx][ty],g[x][y]);
35         }
36     }
37     return false;
38 }
39 int main(){
40     int Test;
41     scanf("%d",&Test);
42     for(int i=3;i<=5;i++)
43         for(int j=1;j<=i;j++)
44             T[i][j]=0;
45     for(int i=1;i<=3;i++)
46         for(int j=5;j>=i;j--)
47             T[i][j]=1;
48     T[2][1]=0;
49     T[4][5]=1;
50     T[3][3]=-1;
51     while(Test--){
52         char s[15];
53         int sx,sy;
54         for(int i=1;i<=5;i++){
55             scanf("%s",s+1);
56             for(int j=1;j<=5;j++){
57                 if(s[j]==‘0‘) g[i][j]=0;
58                 else if(s[j]==‘1‘) g[i][j]=1;
59                 else{
60                     g[i][j]=-1;
61                     sx=i;
62                     sy=j;
63                 }
64             }
65         }
66         bool flag=false;
67         for(int i=1;i<=15;i++){
68             mx=i;
69             if(dfs(1,sx,sy)){
70                 flag=true;
71                 printf("%d\n",i);
72                 break;
73             }
74         }
75         if(!flag) printf("-1\n");
76     }
77     return 0;
78 }
时间: 2024-10-10 00:30:53

[BZOJ1085][SCOI2005]骑士精神 搜索的相关文章

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的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动

[BZOJ1085] [SCOI2005] 骑士精神 (A*)

Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,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的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变

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

洛谷 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 输出样例

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>

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)

[SCOI2005]骑士精神

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

【BZOJ 1085】 [SCOI2005]骑士精神

Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有