╰( ̄ω ̄o)加油沫沫
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
int size[10][5] = {0}, kind[10] = {0};
int que[1000][5] = {0}, a[27][27] = {0};//定义了0~26*0~26的数组
//int s0 = 1, s1 = 0;
bool fit(int i, int step){//*
int L = que[step][1], W = que[step][2];
int l1 = size[i][1] + L - 1, w1 = size[i][2] + W - 1;
bool flag=(l1 <= N) && (w1 <= N);
if(flag == 0) return 0;//若超出边界直接false
for(int j = L; j <= l1; j++)
for(int k = W; k <= w1; k++)
if(a[j][k] == 1) return 0;//若已被占用,直接false
return 1;//都没有则可放置
}
int put(int i, int step, int end){
int L = que[step][1], W = que[step][2];
int l1 = size[i][1] + L - 1, w1 = size[i][2] + W - 1;
for(int j = L; j <= l1; j++)
for(int k = W; k <= w1; k++)
a[j][k] = 1;//将矩阵涂黑
int s1 = 0;//记录栈尾指针的移动步数
if((a[L-1][w1] == 1) && (a[L-1][w1+1] == 1) && (a[L][w1+1] == 0)){//左上角是凹点
end++;
s1++;
que[end][1] = L;
que[end][2] = w1 + 1;
}
if((a[l1][W-1] == 1) && (a[l1+1][W-1] == 1) && (a[l1+1][W] == 0)){//右下角是凹点
end++;
s1++;
que[end][1] = l1 + 1;
que[end][2] = W;
}//将多出来的凹点入栈 (凹点只有可能在左上角和右下角)
return s1;
}
void erase(int i, int step){
int L = que[step][1], W = que[step][2];
int l1 = size[i][1] + L - 1, w1 = size[i][2] + W - 1;
for(int j = L; j <= l1; j++)
for(int k = W; k <= w1; k++)
a[j][k] = 0;//将矩阵涂回白色
//需要出栈吗,还是说step返回之后,会自动将后面的数据覆盖掉?
//直接改变s0??
return;
}
void output(){
int u = 0;
for(int j = 1; j <= 25; j++)
for(int k = 1; k<= 25; k++)
if(a[j][k] == 0) u++;//计算损耗率
if(u <= 25){
for(int i = 1; i <= 6; i++)
cout << kind[i] <<' ';
cout << endl;
}
}
void dfs(int step, int end){//step表示指针(走到哪个点了)//end表示栈尾
//判断是否是最后一个点
if(step > end){//如果是最后一个点,则结束输出,并返回上一步
output();
return;
}
//尝试每一种可能(对栈中的每个点坐标枚举6种放置方法)
int f = 0;
for(int i = 1; i <= 6; i++){
if(fit(i, step)){//判断是否符合条件
f++;
int p = put(i, step, end);//将第i块放置在第step个点上,并将新产生的凹点入栈
//p用来记录新入栈的凹点个数
kind[i]++;//标记,并继续走下一步
dfs(step+1, end+p);//此过程中栈尾end的值其实一直没变
kind[i]--;//消除标记
erase(i, step);
}
}
if(f == 0) dfs(step+1, end);//若6种都放不下则直接空着,也走下一步
//(需要把栈中对应的点删掉吗???)
return;//全部遍历做完后返回
}
int main(){
for(int i = 1; i <= 6; i++)
for(int j = 1; j <= 2; j++)
cin >> size[i][j];
que[1][1] = 1;
que[1][2] = 1;
for(int i = 0; i <= 26; i++) a[0][i] = 1;
for(int i = 0; i <= 26; i++) a[26][i] = 1;
for(int i = 0; i <= 26; i++) a[i][0] = 1;
for(int i = 0; i <= 26; i++) a[i][26] = 1;//将矩阵四周涂黑
dfs(1, 1);
return 0;
}