#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sign=0;//sign=1表示已经找到连通的(initial_field-k)格空地
char map[501][501];
int n,m,k,t;//地图有n行m列,t表示已经走了多少格
int visit[501][501];//数组visit用于记录地图每格是否被访问过
int initial_field;//initial_field为初始化地图时空地的数目
int location[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//4个方位
int boundary_determination(int x,int y)//坐标的边界判定
{
if(x<0||x>=n||y<0||y>=m)//若坐标越界
{
return 0;
}
return 1;
}
int DFS(int round,int colume)
{
int i,x,y;
if(sign)//若已找到可行解
{
return 0;
}
if(t==(initial_field-k))//若已经走完了该走的格数
{
sign=1;
return 0;
}
if(!boundary_determination(round,colume))
{
return 0;
}
if(map[round][colume]=='#')//若此格为墙
{
return 0;
}
if(visit[round][colume])//若当前格已访问
{
return 0;
}
visit[round][colume]=1;//将当前格标记为已访问
t++;
for(i=0;i<4;i++)
{
x=round+location[i][0];
y=colume+location[i][1];
DFS(x,y);
}
return 0;
}
int main()
{
int i,j,a,b;
memset(visit,0,sizeof(visit));
//输入数据
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
}
//计算初始化地图时空地的数目
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
initial_field++;
}
}
}
//
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
DFS(i,j);
break;
}
if(sign)//若找到可行解
{
for(a=0;a<n;a++)
{
for(b=0;b<m;b++)
{
if(map[a][b]=='.'&&!visit[a][b])//若该格为空地且未被访问
{
printf("X");//则该格应被变为墙
}
else
{
printf("%c",map[a][b]);//否则原样输出
}
}
printf("\n");//换行
}
return 0;
}
}
}
return 0;
}
样例2是不是答案不止一种啊
求大佬帮看一下错误