uva387 - A Puzzling Problem

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   for   ar   

A Puzzling Problem

The goal of this problem is to write a program which will take from 1 to 5 puzzle pieces such as those shown below and arrange them, if possible, to form a square. An example set of pieces is shown here.

The pieces cannot be rotated or flipped from their original orientation in an attempt to form a square from the set. All of the pieces must be used to form the square. There may be more than one possible solution for a set of pieces, and not every arrangement will work even with a set for which a solution can be found. Examples using the above set of pieces are shown here.

Input

The input file for this program contains several puzzles (i.e. sets of puzzle pieces) to be solved. The first line of the file is the number of pieces in the first puzzle. Each piece is then specified by listing a single line with two integers, the number of rows and columns in the piece, followed by one or more lines which specify the shape of the piece. The shape specification consists of `0‘ and `1‘ characters, with the `1‘ characters indicating the solid shape of the puzzle (the `0‘ characters are merely placeholders). For example, piece `A‘ above would be specified as follows:

2 3111101

The pieces should be numbered by the order they are encountered in the puzzle. That is, the first piece in a puzzle is piece #1, the next is piece #2, etc. All pieces may be assumed to be valid and no larger than 4 rows by 4 columns.

The line following the final line of the last piece contains the number of pieces in the next puzzle, again followed by the puzzle pieces and so on. The end of the input file is indicated by a zero in place of the number of puzzle pieces.

Output

Your program should report a solution, if one is possible, in the format shown by the examples below. A 4-row by 4-column square should be created, with each piece occupying its location in the solution. The solid portions of piece #1 should be replaced with `1‘ characters, of piece #2 with `2‘ characters, etc. The solutions for each puzzle should be separated by a single blank line.

If there are multiple solutions, any of them is acceptable. For puzzles which have no possible solution simply report ``No solution possible‘‘.

Sample Input
42 31111014 2010111012 1113 210101141 411111 411111 411112 311100152 211112 31111003 21101011 31111 110
Sample Output
1112141234223442No solution possible1133115322232444

 

// 題意:用n個積木塊拼出一個4*4的正方形,要求每個塊恰好用一次,不能旋轉或者翻轉。求任意一個方案
// 演算法:本題寫法有很多,由於規模非常小,這裡給出一個效率不算高但較好實現的方法:每層搜尋選一個可用積木,再枚舉一個位置放上去

 

一個一個放即可。

Piece封裝之後,代碼更清晰。

#include<cstdio>#include<cstring>#include<iostream>#include<string>#include<algorithm>using namespace std;const int maxn=5;int board[maxn][maxn];int n;struct Piece {        int r, c, size;        char data[maxn][maxn];        void read() {                scanf("%d%d", &r, &c);                for(int i=0;i<r;i++)                {                        scanf("%s", data[i]);                        for(int j=0;j<c;j++)                                size+=data[i][j]-‘0‘;                }        }        bool can_place(int x, int y) {                if(x+r>4 || y+c>4) return false;                for(int i=0;i<r;i++)                        for(int j=0;j<c;j++)                                if(data[i][j]==‘1‘ && board[x+i][y+j]!=0)                                        return false;                return true;        }        void fill(int x, int y, int v) {                for(int i=0;i<r;i++)                        for(int j=0;j<c;j++)                                if(data[i][j]==‘1‘)                                        board[x+i][y+j]=v;        }}pieces[5];bool dfs(int d, int cnt){        if(d==n)        {                return cnt==16;        }        for(int i=0;i<4;i++)                for(int j=0;j<4;j++)                {                        if(pieces[d].can_place(i, j))                        {                                pieces[d].fill(i, j, d+1);                                if(dfs(d+1, cnt+pieces[d].size)) return true;                                pieces[d].fill(i, j, 0);                        }                }        return false;}int main(){#ifndef ONLINE_JUDGE        freopen("./uva387.in", "r", stdin);#endif        int kase=0;        while(scanf("%d", &n)==1 && n) {                kase++;                if(kase!=1)                        printf("\n");                memset(pieces, 0, sizeof(pieces));                memset(board, 0, sizeof(board));                int total=0;                for(int i=0;i<n;i++)                {                        pieces[i].read();                        total+=pieces[i].size;                }                if(total==16 && dfs(0, 0))                {                        for(int i=0;i<4;i++)                        {                                for(int j=0;j<4;j++)                                        printf("%d", board[i][j]);                                printf("\n");                        }                }                else                        printf("No solution possible\n");        }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.