我的心愿是世界和平!
题目描述:给定一个矩阵,其中的数字(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;
}