zoukankan      html  css  js  c++  java
  • 山东2012年省赛题之Mine Number

    //Time 0ms,Memory 504KB
    #include<iostream>
    #include<cstring>
    using namespace std;
    int v[25][25],p[25][25],m,n;
    int dfs(int cur,int d)
    {
        int x,y;
        x=cur/m+1;y=cur%m+1;
        if(cur>=n*m) return 1;
        if(y+d<1 || y+d>m)
        {
            if(x==n)
            {
                if(p[x][y]==0)
                    return 1;
                else return 0;
            }
            if(x==n-1)
            {
                if(p[x][y]==0)
                {
                    if(p[x+1][y]!=0) return 0;
                    return 1;
                }
                if(p[x][y]==1)
                {
                    if(p[x+1][y]!=1) return 0;
                    v[x+1][y]=1;p[x+1][y]=p[x][y]=0;
                    return 1;
                }
                else return 0;
            }
            if(p[x][y]==0)
            {
                if(y-d>0 && y-d<=m && p[x+1][y-d]>1) return 0;
            }
            else if(p[x][y]==1)
            {
                if(y-d>0 && y-d<=m && p[x+1][y-d]==0) return 0;
            }
            else return 0;
            if(p[x+1][y]-p[x][y]<0 || p[x+1][y]-p[x][y]>1) return 0;
            p[x+1][y-d]-=p[x][y];p[x+2][y]-=p[x+1][y];v[x+1][y]=p[x][y];v[x+2][y]=p[x+1][y]-p[x][y];p[x+3][y]-=p[x+1][y]-p[x][y];p[x+2][y-d]-=p[x+1][y]-p[x][y];
            int f=dfs(cur+2*m,-1*d);
            if(f) return 1;
            else
            {
                p[x+1][y-d]+=p[x][y];p[x+2][y]+=p[x+1][y];v[x+1][y]=0;v[x+2][y]=0;p[x+3][y]+=p[x+1][y]-p[x][y];p[x+2][y-d]+=p[x+1][y]-p[x][y];
                return 0;
            }
        }
        if(x==n)
        {
            if(y-d>0 && y-d<=m && p[x][y-d]) return 0;
        }
        if(p[x][y]==0)
        {
            if(x-1>0 && y+d>0 && y+d<=m && p[x-1][y+d]) return 0;
            if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]>1) return 0;
            if(x==n-1)
            {
                if(y-d>0 && y-d<=m && p[x+1][y-d]) return 0;
            }
            return dfs(cur+d,d);
        }
        else if(p[x][y]==1)
        {
            if(x==1)
            {
                p[x][y]--;
                if(p[x][y+d]>0)
                {
                    if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]>1) ;
                    else if(y+d+d>0 && y+d+d<=m && p[x][y+d+d]==0) ;
                    else if(x+1<=n && p[x+1][y+d]==0) ;
                    else
                    {
                        p[x+1][y+d]--;p[x][y+d+d]--;p[x][y+d]--;v[x][y+d]=1;
                        int f=dfs(cur+d,d);
                        if(f) return 1;
                        p[x+1][y+d]++;p[x][y+d+d]++;p[x][y+d]++;v[x][y+d]=0;
                    }
                }
                if(x+1<=n && p[x+1][y]>0)
                {
                    if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]==0) ;
                    else if(x+1<=n && y+d>0 && y+d<=m && p[x+1][y+d]==0) ;
                    else if(x+2<=n && p[x+2][y]==0) ;
                    else
                    {
                        p[x+1][y]--;p[x+1][y-d]--;p[x+1][y+d]--;p[x+2][y]--;v[x+1][y]=1;
                        int f=dfs(cur+d,d);
                        if(f) return 1;
                        p[x+1][y]++;p[x+1][y-d]++;p[x+1][y+d]++;p[x+2][y]++;v[x+1][y]=0;
                    }
                }
                p[x][y]++;
            }
            else if(p[x-1][y+d]==1)
            {
                if(x==n-1)
                {
                    if(y-d>0 && y-d<=m && p[x+1][y-d]) return 0;
                }
                if(p[x][y+d]>0)
                {
                    if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]>1) return 0;
                    if(y+d+d>0 && y+d+d<=m && p[x][y+d+d]==0) return 0;
                    if(x+1<=n && p[x+1][y+d]==0) return 0;
                    p[x][y]--;p[x+1][y+d]--;p[x][y+d+d]--;p[x][y+d]--;v[x][y+d]=1;
                    int f=dfs(cur+d,d);
                    if(f) return 1;
                    else
                    {
                        p[x][y]++;p[x+1][y+d]++;p[x][y+d+d]++;p[x][y+d]++;v[x][y+d]=0;
                        return 0;
                    }
                }
                else return 0;
            }
            else if(p[x-1][y+d]==0)
            {
                if(x+1<=n && p[x+1][y]>0)
                {
                    if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]==0) return 0;
                    if(x+1<=n && y+d>0 && y+d<=m && p[x+1][y+d]==0) return 0;
                    if(x+2<=n && p[x+2][y]==0) return 0;
                    p[x][y]--;p[x+1][y]--;p[x+1][y-d]--;p[x+1][y+d]--;p[x+2][y]--;v[x+1][y]=1;
                    if(x==n-1)
                    {
                        if(y-d>0 && y-d<=m && p[x+1][y-d])
                        {
                            p[x][y]++;p[x+1][y]++;p[x+1][y-d]++;p[x+1][y+d]++;p[x+2][y]++;v[x+1][y]=0;
                            return 0;
                        }
                    }
                    int f=dfs(cur+d,d);
                    if(f) return 1;
                    else
                    {
                        p[x][y]++;p[x+1][y]++;p[x+1][y-d]++;p[x+1][y+d]++;p[x+2][y]++;v[x+1][y]=0;
                        return 0;
                    }
                }
                else return 0;
            }
            else return 0;
        }
        else if(p[x][y]==2)
        {
            if((y+d<=m && y+d>0 && p[x][y+d]<1) || (x+1<=n && p[x+1][y]<1)) return 0;
            if(x-1>0 && p[x-1][y+d]!=1) return 0;
            if(x+1<=n && y-d>0 && y-d<=m && p[x+1][y-d]==0) return 0;
            if(y+d+d>0 && y+d+d<=m && p[x][y+d+d]==0) return 0;
            if(x+1<=n && p[x+1][y+d]==0) return 0;
            if(x+1<=n && y+d>0 && y+d<=m && p[x+1][y+d]==0) return 0;
            if(x+2<=n && p[x+2][y]==0) return 0;
            p[x][y]=0;p[x+1][y+d]--;p[x][y+d+d]--;p[x][y+d]--;v[x][y+d]=1;
            p[x+1][y]--;p[x+1][y-d]--;p[x+1][y+d]--;p[x+2][y]--;v[x+1][y]=1;
            if(x==n-1)
            {
                if(y-d>0 && y-d<=m && p[x+1][y-d])
                {
                    p[x][y]=2;p[x+1][y+d]++;p[x][y+d+d]++;p[x][y+d]++;v[x][y+d]=0;
                    p[x+1][y]++;p[x+1][y-d]++;p[x+1][y+d]++;p[x+2][y]++;v[x+1][y]=0;
                    return 0;
                }
            }
            int f=dfs(cur+d,d);
            if(f) return 1;
            else
            {
                p[x][y]=2;p[x+1][y+d]++;p[x][y+d+d]++;p[x][y+d]++;v[x][y+d]=0;
                p[x+1][y]++;p[x+1][y-d]++;p[x+1][y+d]++;p[x+2][y]++;v[x+1][y]=0;
                return 0;
            }
        }
        return 0;
    }
    int main()
    {
        int i,j,t,cnt=1;
        char s;
        cin>>t;
        while(t--)
        {
            cin>>n>>m;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    cin>>s;p[i+1][j+1]=s-'0';
                }
            }
            memset(v,0,sizeof(v));
            if(p[1][1]==0) dfs(0,1);
            else if(p[1][1]==3)
            {
                v[1][1]=1;p[1][1]=2;p[1][2]--;p[2][1]--;dfs(0,1);
            }
            else
            {
                if(dfs(0,1)==0)
                {
                    v[1][1]=1;p[1][1]--;p[1][2]--;p[2][1]--;dfs(0,1);
                }
            }
            cout<<"Case "<<cnt++<<":"<<endl;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    if(v[i+1][j+1]) cout<<"*";
                    else cout<<".";
                }
                cout<<endl;
            }
        }
        return 0;
    }
    


  • 相关阅读:
    基础之实战猜年龄游戏
    基本运算符与if while详解:
    while循环练习:
    常量与格式化输出练习
    Flask基础(05)-->路由的基本定义
    Flask基础(04)-->相关配置参数
    Flask基础(03)-->创建第一个Flask程序
    Flask基础(02)-->搭建Flask项目虚拟环境
    Flask基础(01)-->Flask框架介绍
    Flask实战第61天:帖子板块过滤显示
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218265.html
Copyright © 2011-2022 走看看