木其网络科技专业程序员代写http://www.xmsydw.com
程序员学历擅长经验网店链接
apenny硕士ASP.NET PHP 电子 通信设计 图像 编程 网络5年进入店铺
zheng_qianqian本科C语言 C++面向对象 Java3年进入店铺
guoguanl本科Java Web项目 JSP Hibernate Struts Mysql4年进入店铺

山东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;
}


posted @ 2013-05-17 15:29  C语言程序  阅读(125)  评论(0编辑  收藏  举报
木其网络科技专业程序员代写http://www.xmsydw.com
程序员学历擅长经验网店链接
apenny硕士ASP.NET PHP 电子 通信设计 图像 编程 网络5年进入店铺
zheng_qianqian本科C语言 C++面向对象 Java3年进入店铺
guoguanl本科Java Web项目 JSP Hibernate Struts Mysql4年进入店铺