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\n":"NO\n");
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\n",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一个。

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

 

 

posted on 2013-11-23 18:41  从此以后  阅读(283)  评论(0编辑  收藏  举报