题意:
给出方格大小以及某一些已填数字,需要我们自己填数字,要求,相同数字不相邻,包括斜的,在给定的区域内刚好用够1-n几个数字
思路:搜索即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
int ma[maxn][maxn],indexx[maxn][maxn],number[maxn],row,column,cnt;
bool vis[maxn][maxn];
void init()
{
memset(vis,false,sizeof (vis));
memset(ma,0,sizeof (ma));
memset(indexx,0,sizeof (indexx));
memset(number,0,sizeof (number));
}
bool judege(int x,int y,int val)
{
for(int i = -1 ; i <= 1; i++)
{
for(int j = -1; j <= 1; j++)
{
if(i== 0 && j==0)continue;
int nx = x + i;
int ny = y + j;
if(nx <=0 ||ny <=0 ||nx > row||ny >column) continue;
if(ma[nx][ny] == val) return false;
}
}
return true;
}
int dfs(int x, int y)
{
int f = 0;
if(x > row) return 1;
if(ma[x][y])
{
if(y == column)
f = dfs(x + 1,1);
else
f = dfs(x,y + 1);
return f;
}
int maxx = number[indexx[x][y]];
for(int i = 1; i <= maxx;i++)
{
if(!vis[indexx[x][y]][i] && judege(x,y,i))
{
vis[indexx[x][y]][i] = 1;
ma[x][y] = i;
if( y == column)
f = dfs(x + 1,1);
else
f = dfs(x,y+1);
if(!f)
{
vis[indexx[x][y]][i] = 0;
ma[x][y] = 0;
}
else
{
return 1;
}
}
}
return 0;
}
int main()
{
int t,n,maxx;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d %d %d",&cnt,&row,&column);
getchar();
for(int i= 1; i <= row; i++)
{
for(int j = 1; j <= column; j++)
{
char c;
cin>>c;
if(c == '-')
ma[i][j] = 0;
else
ma[i][j] = c - '0';
}
}
scanf("%d",&n);
for(int i = 1; i<= n;i++)
{
//cout<<1<<endl;
scanf("%d",&number[i]);
for(int j= 1;j <= number[i];j++)
{
int nx,ny;
scanf(" (%d,%d)",&nx,&ny);
indexx[nx][ny] = i;
}
}
for(int i = 1; i <= row; i++)
{
for(int j =1; j<= column;j++ )
{
if(ma[i][j])
{
vis[indexx[i][j]][ma[i][j]] = 1;
}
}
}
bool x = dfs(1,1);
cout<<cnt<<endl;
for(int i = 1; i <= row;i++)
{
for(int j = 1; j<= column;j++)
{
if(j != column)
printf("%d ",ma[i][j]);
else
printf("%d\n",ma[i][j]);
}
}
}
return 0;
}