1.题意:给你一个n*m的地图,让你往里面空位置填数字,其中' - '表示空,有数字的表示已经填好了不能更改。然后把地图划分为k部分,每一部分有l个点,规定每一部分的点填的数字只能在1 ~ l 之间并且该位置四周八个方向均不能有相同的数字,问怎么分配,并画出地图。
Input:
1
1 3 5
- - - - -
- - - - -
4 - - - 1
5
1 (1,1)
2 (1,2) (1,3)
5 (2,1) (2,2) (3,1) (3,2) (3,3)
4 (2,3) (2,4) (1,4) (1,5)
3 (3,4) (3,5) (2,5)
outPut:
1
1 2 1 2 1
3 5 3 4 3
4 2 1 2 1
2.分析:
直接逐行放置数字,判断即可DFS
3.代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int maps[8][8];
int t,r,c,dive;
int pre[50][50];
bool judge[50][50];
int temp[50];
bool sign(int a,int b,int val){//判断是否可以放置
for(int i = -1;i<=1;i++){
for(int j = -1;j<=1;j++){
if(i||j){
int fx = a+i;
int fy = b+j;
if(fx>=1&&fx<=r&&fy>=1&&fy<=c){
if(maps[fx][fy]!=val)continue;
else return false;
}
}
}
}
return true;
}
bool DFS(int x,int y){
//cout<<"now : "<<x<<" "<<y<<endl;
if(maps[x][y]){//该点有固定数字
if(x==r&&y==c){//到达终点退出
//cout<<"yep!!"<<endl;
return true;
}
else if(y+1<=c){//优先走同一列
if(DFS(x,y+1))return true;
}
else if(x+1<=r){//然后转向下一行第一列
if(DFS(x+1,1))return true;
}
}
for(int i = 1;i<=temp[pre[x][y]];i++){//在该部分选择数字
if(!judge[pre[x][y]][i]&&sign(x,y,i)){//该部分这个数字没有被标记并且该点可以放
judge[pre[x][y]][i] = 1;
int temp = maps[x][y];//暂时标记
maps[x][y] = i;
if(x==r&&y==c){
//cout<<"yep!!"<<endl;
return true;
}
if(y+1<=c){
if(DFS(x,y+1))return true;
}
else if(x+1<=r){
if(DFS(x+1,1))return true;
}
judge[pre[x][y]][i] = 0;//回溯
maps[x][y] = temp;
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(maps,0,sizeof(maps));
memset(judge,0,sizeof(judge));
scanf("%d%d%d",&t,&r,&c);
for(int i = 1;i<=r;i++){
for(int j = 1;j<=c;j++){
char ch;
cin>>ch;
if(ch>='1'&&ch<='9'){
maps[i][j] = ch - '0';//地图记录固定点,空位置变为0
}
}
}
scanf("%d",&dive);//几部分
for(int i = 1;i<=dive;i++){
int len;scanf("%d",&len);//每部分长度
temp[i] = len;//记录第几部分的长度
for(int j = 1;j<=len;j++){
int x,y;
scanf(" (%d,%d)",&x,&y);//输入点
pre[x][y] = i;//该点记录部分编号 (x,y)在第i部分,该部分长度为len
}
}
for(int i = 1;i<=r;i++){
for(int j = 1;j<=c;j++){
//cout<<maps[i][j]<<" ";
if(maps[i][j]){
judge[pre[i][j]][maps[i][j]] = 1;//标记了的点在该部分把该长度标记
}
}
//cout<<endl;
}
DFS(1,1);//DFS从第一行第一列
printf("%d\n",t);
for(int i = 1;i<=r;i++){
for(int j = 1;j<=c;j++){
if(j==1)printf("%d",maps[i][j]);
else printf(" %d",maps[i][j]);
}
printf("\n");
}
}
return 0;
}