2018激光样式
#include
using namespace std;
/*
dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 可选,无论vis[i-1]为何值都不选
vis[i] 回溯标记是否用过
*/
int n = 30;
int vis[35];
int ans = 0;
int dp[35];
void dfs(int x){
if(x == n+1){
ans++;
return;
}
dfs(x+1); //这个点不开激光
if(vis[x-1] == 0){//前一个点没开激光 那么这个点可以开激光: vis[x] = 1就表示开激光
vis[x] = 1;
dfs(x+1);
vis[x] = 0;//回溯
}
}
int main(){
for(int i=1;i<=30;i++) vis[i] = 0;
dfs(1);
cout<
2017磁砖样式
#include
using namespace std;
int n,m;
const int maxn = 10;
int g[maxn][maxn];
vector v;
set > se;
set > se2;
map Hash;
int ans = 0;
bool check_color() {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
if(i+1 <= n && j+1 <= m) {
//1 1 1 1 2 2 2 2 1 2 1 2
if((g[i][j]+g[i][j+1]+g[i+1][j]+g[i+1][j+1]) % 4 == 0)
return false;
}
}
return true;
}
bool check2(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j] == 0){
return false;
}
}
}
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m-1;j++){
int aa = g[i][j];
int bb = g[i+1][j];
int cc = g[i][j+1];
int dd = g[i+1][j+1];
if(aa == bb && aa ==cc && bb== cc && cc == dd && bb == dd && aa == dd){
return false;
}
}
}
return true;
}
bool check(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j] == 0){
return false;
}
}
}
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m-1;j++){
if(g[i][j] == g[i+1][j] == g[i][j+1] == g[i+1][j+1])
return false;
}
}
return true;
}
void dfs(int x,int y){
if(x == n+1 && y == 1){
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout< >::iterator it = se2.begin();
vector vv;
while(it != se2.end()){
if(se2.find(*it) != se2.end() && se.find(*it) == se.end() ){
vv = *it;
break;
}
it++;
}
int t = 0;
for(int i=0;i
2016凑平方数
#include
using namespace std;
/*
分成几组? k组 1 ~ 10;
每组:dfs搜索0~9这几个没用过的数;
if 完全平方数
1.x+1
2.继续加值 (0不能作为第一个数 单独考虑)
到了k组 先对结果排序存到vector数组中 再set去重(因为递归回溯 结果有大量重复)
注意:必须用long long...用int会出错 因为int的取值范围为:-2147483648 ~ 2147483647
*/
typedef long long ll;
int vis[15];
ll a[15];
vector v;
int vis2[10];
int k;
int ans = 0;
set > se;
inline bool check(ll x){
if(x == 9814072356){
int eeeeee = 1;
}
double d = sqrt(x);
return d == (ll)d;
}
//因为递归回溯有大量重复 改成set去重
void dfs(int x,ll cur){
if(x == k){
for(int i=0;i<10;i++){
vis2[i] = 0;
}
for(int i=0;i
2015完美正方形
#include
using namespace std;
int n = 47 + 46 + 61;//边长
int a[19] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 50, 52};
int g[500][500];//大正方形地图
int vis[30];
set se;//集合存储正方形最后一行边长数据结果
void fill(int x,int y,int l,int num){
for(int i=x;i<=x+l-1;i++){
for(int j=y;j<=y+l-1;j++){
g[i][j] = num;
}
}
}
bool ok(int x,int y,int l){
if(x+l-1 > n) return false;
if(y+l-1 > n) return false;
for(int i=x;i<=x+l-1;i++){
for(int j=y;j<=y+l-1;j++){
if(g[i][j] != 0) return false;
}
}
return true;
}
bool check(){
return true;
}
void dfs(int x,int y){
if(x == n+1){//递归出口
if(check()){
for(int i=1;i<=n;i++){
se.insert(g[n][i]);//set集合存储最后一层正方形边长数据
}
}
return;
}
if(g[x][y] != 0 ){//当前正方形填充过了
if(y == n)
dfs(x+1,1);//dfs下一个
else
dfs(x,y+1);//dfs下一个
}else{//当前正方形没有填充过
for(int i=0;i<19;i++){//枚举19块正方形
if(!vis[i]){
if(ok(x,y,a[i])){
fill(x,y,a[i],a[i]);//填充正方形成a[i]边长 以(x,y)为左上顶点
vis[i] = 1;
if(y == n){
dfs(x+1,1);//dfs下一个
}else{
dfs(x,y+1);//dfs下一个
}
vis[i] = 0;//回溯
fill(x,y,a[i],0);//填充正方形成0 以(x,y)为左上顶点
}else{
break;//剪枝 因为a数组按顺序排的 当前边长不行 后面边长更不行了
}
}
}
}
}
int main(){
fill(1,1,47,47);//填充以(1,1)为左上顶点的正方形 边为47
fill(1,47+1,46,46);
fill(1,47+46+1,61,61);
dfs(1,1);//从(1,1)点开始搜索
set::iterator it = se.begin();
while(it!=se.end()){
cout<<*it<<" ";
it++;
}
return 0;
}
//30 33 41 50