Mine Number

来源:互联网 发布:淘宝店铺0信誉出售 编辑:程序博客网 时间:2024/06/16 06:29

我的心愿是世界和平!

题目描述:给定一个矩阵,其中的数字(0-5)代表本身及其四周(上、下、左、右)的'*'的个数,其他用'.'填充。(只有一种答案)样例:2     5 6     001110     013431     014541     013431     001110     2 4     1111     2332     //Case 1:       ......       ..***.       ..***.       ..***.       ......       Case 2:       ....       ****
#include<cstdio>#include<iostream>using namespace std;char Map[25][25];int m,n,flag,Num[25][25];int Found(int x,int y){    if(Num[x][y]<=0)        return 0;    if(x-1>=0&&Num[x-1][y]<=0)        return 0;    if(y-1>=0&&Num[x][y-1]<=0)        return 0;    if(x+1<m&&Num[x+1][y]<=0)        return 0;    if(y+1<n&&Num[x][y+1]<=0)        return 0;    return 1;}void Change(int x,int y){    Num[x][y]--;    if(x-1>=0)        Num[x-1][y]--;    if(y-1>=0)        Num[x][y-1]--;    if(x+1<m)        Num[x+1][y]--;    if(y+1<n)        Num[x][y+1]--;}void Back(int x,int y){    Num[x][y]++;    if(x-1>=0)        Num[x-1][y]++;    if(y-1>=0)        Num[x][y-1]++;    if(x+1<m)        Num[x+1][y]++;    if(y+1<n)        Num[x][y+1]++;}void Dfs(int x,int y){    if(flag)//已输出要求矩阵.    {        return ;    }    if(x==m)    {        int t=0;        for(int i=0; i<n; i++)        {            if(Num[x-1][i]!=0)            {                t=1;                break;            }        }        if(t)//现在的Map数组不符合要求.        {            return ;        }        else        {            for(int i=0; i<m; i++)            {                for(int j=0; j<n; j++)                {                    cout<<Map[i][j];                }                cout<<endl;            }            flag=1;            return ;        }    }    if(y==n)    {        Dfs(x+1,0);        return ;    }    if(x==0)    {        if(Found(x,y))//判断是否四周及本身都大于1.        {            Map[x][y]='*';            Change(x,y);//将四周及本身减1.            Dfs(x,y+1);            Back(x,y);//将四周及本身加1.        }        Map[x][y]='.';        Dfs(x,y+1);    }    else    {        if(Num[x-1][y]==0)        {            Map[x][y]='.';            Dfs(x,y+1);        }        else        {            if(Num[x-1][y]==1)            {                if(Found(x,y))                {                    Map[x][y]='*';                    Change(x,y);                    Dfs(x,y+1);                    Back(x,y);                }            }        }    }}int main(){    int T;    char c;    cin>>T;    for(int o=1; o<=T; o++)    {        printf("Case %d:\n",o);        cin>>m>>n;        for(int i=0; i<m; i++)        {            for(int j=0; j<n; j++)            {                cin>>c;                Num[i][j]=c-'0';            }        }        flag=0;        Dfs(0,0);    }    return 0;}