zoukankan      html  css  js  c++  java
  • HDU_1175_连连看

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1175

    大意:连连看规则,只能转两次弯,先输入矩阵0表示没有棋子,正整数表示不同的棋子,然后询问,输入两点坐标,判断能否消除。(询问没有先后顺序,都针对当前状态)

    分析:dfs,普通迷宫搜索,加上判断转弯次数。

    总结:看题仔细,继续加强dfs。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define N 1005
    
    int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
    int map[N][N];
    int vis[N][N];
    int n,m;
    int flag=0;
    int a1,a2,b1,b2;
    
    bool inside(int x,int y)
    {
        if(x>=1&&x<=n&&y>=1&&y<=m)
            return 1;
        return 0;
    }
    
    void dfs(int x,int y,int turn,int dire)
    {
        if(!inside(x,y))
            return;
        if(turn-1>2)
            return;
        if(x==b1&&y==b2)
        {
            //cout<<turn<<'*'<<endl;
            flag=1;
            return;
        }
        if(flag==1)
            return;
        for(int i=0; i<4; i++)
        {
            int mx=x+dir[i][0];
            int my=y+dir[i][1];
            if(map[mx][my]==0&&!vis[mx][my])
            {
                if(i!=dire)
                {
                    vis[mx][my]=1;
                    dfs(mx,my,turn+1,i);
                    vis[mx][my]=0;
                }
                else
                {
                    vis[mx][my]=1;
                    dfs(mx,my,turn,dire);
                    vis[mx][my]=0;
                }
            }
    
        }
    }
    
    int main()
    {
        int q;
        while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
        {
            for(int i=1; i<=n; i++)
                for(int j=1; j<=m; j++)
                    scanf("%d",&map[i][j]);
            scanf("%d",&q);
            while(q--)
            {
    
                scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
                if((map[a1][a2]!=map[b1][b2])||(map[a1][a2]==0||map[b1][b2]==0))
                    printf("NO
    ");
                else
                {
                    flag=0;
                    int tmp=map[a1][a2];
                    map[b1][b2]=0;
                    memset(vis,0,sizeof(vis));
                    dfs(a1,a2,0,5);
                    map[a1][a2]=map[b1][b2]=tmp;
                    if(flag)
                        printf("YES
    ");
                    else
                        printf("NO
    ");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    vimrc 配置 史上最牛
    nmap 黑客 端口扫描(转)
    linux export 命令(转)
    【引用】linux下编译静态库ranlib有什么用
    vim map nmap(转)
    vim 自定义命令 自定义快捷键(转)
    vimrc初学 vim 快捷键 map(转)
    vim 取消 查找 高亮
    Java内存模型(JMM)学习总结
    Struts2和Spring整合
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/4798938.html
Copyright © 2011-2022 走看看