一些水帖
  • 板块灌水区
  • 楼主pascalorz
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/4/9 00:14
  • 上次更新2024/4/9 13:05:12
查看原帖
一些水帖
50621
pascalorz楼主2024/4/9 00:14

╰( ̄ω ̄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;
	
}
2024/4/9 00:14
加载中...