博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva-387-暴力枚举
阅读量:6548 次
发布时间:2019-06-24

本文共 3929 字,大约阅读时间需要 13 分钟。

题意:

给你一些小方块,问是不是能组成一个4X4的大方块,所有方块全部要使用,裸枚举

#include 
#include
#include
using namespace std;const int NN = 20;class Piece{ private: int r; int c; int** p; public: Piece() : r(0), c(0) { p = NULL; } Piece(int r, int c, int (*pp)[NN]) { this->r = r; this->c = c; this->p = new int*[r]; for(int i = 0; i < r; i++) { this->p[i] = new int[c]; memcpy(this->p[i], pp[i], c * sizeof(int)); } } ~Piece() { for(int i = 0; i < r; i++) delete[] p[i]; delete this->p; } int getR() { return this->r; } int getC() { return this->c; } int ** getP() { return this->p; }};int N;int r, c;int m[6][6];int vis[NN];Piece* piece[NN];int pi = 0;void dump(){ for(int i = 0; i < pi; i++) for(int j = 0; j < piece[i]->getR(); j++) { for(int k = 0; k < piece[i]->getC(); k++) cout << piece[i]->getP()[j][k]; cout << endl; }}bool judge(int y, int x, Piece* p){ for(int i = 0; i < p->getR(); i++) for(int j = 0; j < p->getC(); j++) if(p->getP()[i][j] != 0 && m[i + y][x + j] != 0) { return false; } return true;}void reset(int x, int y, int r, int c, int cur){ for(int i = 0; i < r; i++) for(int j = 0; j < c; j++) { if(m[y + i][x + j] != cur) continue; m[y + i][x + j] = 0; }}void copy(int x, int y, int r, int c, int** src){ for(int i = 0; i < r; i++) for(int j = 0; j < c; j++) { if(m[y + i][x + j]) continue; m[y + i][x + j] = src[i][j]; }}bool dfs(int cur){ if(cur == pi) { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) if(m[i][j] == 0) return false; } return true; } //对当前的cur,枚举每一个坐标X,Y for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { if(m[i][j] && (piece[cur]->getP()[0][0])) continue; if(!judge(i, j, piece[cur])) continue; int r = piece[cur]->getR(); int c = piece[cur]->getC(); copy(j, i, r, c, piece[cur]->getP()); int ok = dfs(cur + 1); if(ok) return ok; reset(j, i, r, c, cur + 1); } } return false;}int main(){ //freopen("d://1.text", "r", stdin); int t = 0; while (cin >> N && N) { if(t != 0) cout << endl; ++t; memset(m, 0, sizeof(m)); memset(piece, 0, sizeof(piece)); memset(vis, 0, sizeof(vis)); int p[NN][NN]; pi = 0; for(int i = 1; i <= N; i++) { scanf("%d %d", &r, &c); for(int j = 0; j < r; j++) for(int k = 0; k < c; k++) { char t; cin >> t; if(t == '0') p[j][k] = 0; else p[j][k] = i; } Piece* pp = new Piece(r, c, p); piece[pi++] = pp; } bool ok = dfs(0); if(!ok) { cout << "No solution possible" << endl; } else { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) cout << m[i][j]; cout << endl; } } }// dump(); return 0;}

 

posted on
2018-06-24 18:41 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9221362.html

你可能感兴趣的文章
git fetch & pull详解
查看>>
boost_1.63.0编译VS2013
查看>>
jQuery 插件-(初体验一)
查看>>
PHP语言 -- Ajax 登录处理
查看>>
基于js的CC攻击实现与防御
查看>>
我的家庭私有云计划-19
查看>>
项目实践中Linux集群的总结和思考
查看>>
关于使用Android NDK编译ffmpeg
查看>>
监控MySQL主从同步是否异常并报警企业案例模拟
查看>>
zabbix从2.2.3升级到最新稳定版3.2.1
查看>>
我有一个网站,想提高点权重
查看>>
浅谈(SQL Server)数据库中系统表的作用
查看>>
微软邮件系统Exchange 2013系列(七)创建发送连接器
查看>>
程序员杂记系列
查看>>
【树莓派】制作树莓派所使用的img镜像(一)
查看>>
理解网站并发量
查看>>
spring整合elasticsearch之环境搭建
查看>>
TensorFlow 架构与设计-编程模型【转】
查看>>
如何运行Struts2官网最新Demo?
查看>>
'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
查看>>