• Codeforce 362A Two Semiknights Meet


    今天训练的题目,当时CFOJ挂了,没有显示结果,结果是WA了。

    做得很着急,用广搜做。其实题目还不是很明白的

    最后结束的时候看了一下别人博客的题解的意思,瞬间明白了

    题意:同时移动两个'K'点,问两个点最终能不能相遇。

    总结:

    1.没看清楚题目就做了,心态不稳定,太着急了。当时第一名交了这题,我的上一题才3A

    2.题目中的'#'好像是坑爹陷阱的,没什么用,看清楚题目最重要。

    3.细心点很快就找到规律。其实田字走法加上一个8*8的地域限制,绝对找到了可解决点。

    4.用广搜的方法做,过不了7个测试数据,当然我的求解的目的已经错了。

    5.只要两个点的横纵坐标的距离满足关系就可以知道了。详见代码

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <cmath>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int T;
     9     scanf("%d",&T);
    10     while(T--)
    11     {
    12         int x1,x2,y1,y2,cur=0;
    13         char s[10];
    14         for(int i=0;i<8;i++){
    15             scanf("%s",s);
    16             for(int j=0;j<8;j++){
    17                 if(s[j]=='K'){
    18                     if(cur) x2=i,y2=j;
    19                     else x1=i,y1=j,cur=1;
    20                 }
    21             }
    22         }
    23         printf((abs(x1-x2)%4==0&&abs(y1-y2)%4==0)?"YES
    ":"NO
    ");
    24     }
    25     return 0;
    26 }
    View Code

     其实搜索才是最强大的,不过这道题还是用规律比较好解决,刚刚写了一个深搜1Y了贴贴代码先

    #include <stdio.h>
    #include <string.h>
    
    const int dx[] = {2,-2,2,-2};
    const int dy[] = {-2,2,2,-2};
    
    int vis[10][10]  , flag = 0;
    int x1,x2,y1,y2;
    
    bool is_not(int x ,int y) {
        return (x<0||x>7||y<0||y>7);
    }
    
    void dfs(int x,int y,int z)
    {
        //printf("%d %d
    ",x,y);
        if(x == x2 && y == y2 && z%2 == 0) {
            
            flag=1;
            return;
        }
        for(int i=0;i<4;i++){
            int nx = x + dx[i] , ny = y + dy[i];
            if(is_not(nx,ny) || vis[nx][ny]) continue;
            vis[nx][ny] = 1;
            dfs(nx,ny,z+1);
        }
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            flag = 0;
            int cur = 0;
            for(int i=0;i<8;i++)
            {
                char s[100];
                scanf("%s",s);
                for(int j=0;j<8;j++) 
                {
                    if(s[j] == 'K'){
                        if(!cur) x1=i,y1=j,cur++;
                        else x2=i,y2=j;
                    }
                }
            }
            memset(vis,0,sizeof(vis));
            dfs(x1,y1,0);
            if(flag == 1) puts("YES");
            else puts("NO");
        }
        return 0;
    }
    /*
    3
    ........
    ........
    ......#.
    K..##..#
    .......#
    ...##..#
    ......#.
    K.......
    
    ........
    ........
    ..#.....
    ..#..#..
    ..####..
    ...##...
    ........
    ....K#K#
    
    */
    View Code

    训练的时候,我是用两点搜索来做的,也就是暴力求出它们的移动路径的解,然后暴力对比这些值看能不能达到要求
    可惜是wa的代码,调了一个上午的代码,死活过不了样例7,mark一个。

    其实深搜的代码相当简洁,如果每个搜索的节点都只被搜过一次,时间复杂度并没有那么恐怖,学会深搜是基本。

  • 相关阅读:
    fastcgi与cgi的区别
    SolidWorks eDraring Control
    基于SolidWorks的CAD系统研究
    构建以快速设计为目标的PDM系统
    模型图纸数据库设计
    VB开发SolidWorks实现机械产品参数化设计
    参数化图形驱动及Web零件库的研究开发
    基于PDM的 标准件库管理
    子窗口设计及编程
    某机械设备CAD系统的构造与设计
  • 原文地址:https://www.cnblogs.com/cton/p/3439291.html
Copyright © 2020-2023  润新知