UVA - 387 A Puzzling Problem

题目链接:

https://vjudge.net/problem/UVA-387

思路:

非常有意思的拼图,深搜+回溯,

输出硬伤:除了第一次之外,每次先输空格,再输出结果,

以及可能给的数据拼不成4*4表格的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[5][5];
int g[10010][5][5];
int maze[10010][2];
int sum=0;
int n;
int Find=0,Case=0;
void dfs(int cur){
    if(cur==n+1){//
        Find=1;
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                printf("%d",vis[i][j]);
            }
            printf("\n");
        }
        return;
    }
    if(Find) return;
    for(int i=0;i<=4-maze[cur][0];i++){//4*4表格起点横坐标
        for(int j=0;j<=4-maze[cur][1];j++){//4*4表格起点纵坐标
            int flag=0;//判重 
            for(int p=0;p<maze[cur][0];p++){
                for(int q=0;q<maze[cur][1];q++){
                    if(!flag&&!vis[i+p][j+q]&&g[cur][p][q]==1)
                        vis[i+p][j+q]=cur;
                    else if(!flag&&g[cur][p][q]==0)
                        continue;
                    else
                        flag=1;
                }
            }
            if(!flag) dfs(cur+1);
            
            if(Find) return;
            for(int p=0;p<4;p++){//重新扫描一遍表格,将上一次的清零 
                for(int q=0;q<4;q++){
                    if(vis[p][q]==cur)
                        vis[p][q]=0;
                }
            }
        }
    }
}
void init(){
    memset(vis,0,sizeof(vis));
    memset(g,0,sizeof(g));
    memset(maze,0,sizeof(maze));
    sum=0;
    Find=0;
    Case++;
}
int main(int argc, char** argv) {
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        init();
        
        for(int i=1;i<=n;i++){ 
            scanf("%d %d",&maze[i][0],&maze[i][1]);
            string line;
            
            for(int j=0;j<maze[i][0];j++){
                cin>>line;
                for(int k=0;k<maze[i][1];k++){
                    g[i][j][k]=line[k]-'0';
                    sum+=g[i][j][k];//有可能根本拼不成 
                }
            }
        }
        if(Case!=1) printf("\n");
        if(sum==16)
            dfs(1);
        if(!Find) printf("No solution possible\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhuixunfighting/p/10047002.html