UVALive - 8290 Capsules

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40772692/article/details/82254574
今日推荐