uva 10422 - Knights in FEN ID+dfs

简介:

10422 - Knights in FEN

 

     经典的棋盘类问题,移动骑士到达指定状态,最少要几次,如果超过10次则输出Unsolvable in less than 11 move(s).

 

     一开始想bfs的,但是状态量比较大,又懒得写hash,又想到了最坏情况,也就是超出10次时,dfs和bfs复杂度都一样,于是就果断用了ID+dfs,编程难度非常低。

     不用加剪枝就可以过了,我的代码里加了个最优下限,这样不用每次从0开始进行ID,刚有想到可以利用当前最优情况进行可行性剪枝,但要睡觉了就不再优化了。

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define INF 1E9
using namespace std;
const int dir[8][2]={-2,-1,-1,-2,1,-2,2,-1,-2,1,-1,2,1,2,2,1};
const string aim="111110111100 110000100000";
char s[26];
char now[6][6];
int dfs(int depth,string s)
{
    if(s==aim)return 1;
    if(depth==0)return 0;
    int i,j,m,k=0,x,y,tx,ty;
    for(i=0;i<5;i++ )
     for(j=0;j<5;j++)
     {
       if(s[k]==' '){x=j,y=i;}
       now[i][j]=s[k++];
     }
    for(i=0;i<8;i++)
    {
        tx=x+dir[i][0];ty=y+dir[i][1];
        if(tx<0||tx>4||ty<0||ty>4)continue;
        swap(now[ty][tx],now[y][x]);
        for(m=0,k=0;m<5;m++)
         for(j=0;j<5;j++)
           s[k++]=now[m][j];
        if(dfs(depth-1,s))return 1;
        swap(now[ty][tx],now[y][x]);
    }
    return 0;
}
int main()
{
    int T,i,j,k;
    scanf("%d",&T);
    while(T--)
    {
        int Min=0;//确定最优情况
       for(i=0,k=0;i<5;i++)
       {
           getchar();
           for(j=0;j<5;j++)
           {
            s[k++]=getchar();
            Min+=(s[k-1]!=aim[k-1]);
           }
       }
       s[k]='\0';
       for(i=Min/2;i<11&&!dfs(i,s);i++);
       if(i<11)printf("Solvable in %d move(s).\n",i);
       else printf("Unsolvable in less than 11 move(s).\n");
    }
}


 

目录
相关文章
|
8月前
|
流计算
POJ 3620--Avoid The Lakes【DFS】
POJ 3620--Avoid The Lakes【DFS】
40 0
|
Java
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
69 0
Find The Multiple(dfs和bfs都可)
Find The Multiple(dfs和bfs都可)
32 0
CF711D-Directed Roads(组合数学 dfs找环)
CF711D-Directed Roads(组合数学 dfs找环)
90 0
CF711D-Directed Roads(组合数学 dfs找环)
codeforces1244——D.Paint the Tree(dfs)
codeforces1244——D.Paint the Tree(dfs)
90 0
【1103】Integer Factorization (DFS)
(1)开一个vector数组fac存0^ p ,1^ p… i ^ p. (2)DFS: 分叉口:利用DFS对fac[index]进行选择,有“选”与“不选”两种选择,如果不选,则把问题转化为对fac[index]进行选择;如果选择,由于每个数字可以重复选择即下一次还能选择fac[index]。 递归边界:2个return,第一个满足sum == N且nowK==
123 0
【1103】Integer Factorization (30分)【DFS】
【1103】Integer Factorization (30分)【DFS】 【1103】Integer Factorization (30分)【DFS】
95 0
【1111】Online Map (30分)【dijstra+dfs】
用两次dijstra+dfs https://copyfuture.com/blogs-details/20191206210028662rkm5pf6m0s0gc9z 只用dijstra(注释清晰) https://blog.csdn.net/liu16659/article/details/88884830
108 0
|
存储
1103. Integer Factorization (30) dfs
#include #include #include using namespace std; int n, k, p, maxFacSum = -1; // n 和 k 几个数字 p阶数 vector v, ...
891 0

热门文章

最新文章