警示后人-搜索解法
  • 板块P2089 烤鸡
  • 楼主yiduiiii
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/3 17:16
  • 上次更新2023/11/2 16:05:41
查看原帖
警示后人-搜索解法
524450
yiduiiii楼主2023/10/3 17:16

ans数组一定要开得够大啊

#include <iostream>
#include <cstdio>
using namespace std;

int n;
int ans[10008][10];//ans数组一定要开得够大啊
long long int cnt=0;

int av;
int it[10];

void solve(int d)
{
    if ((10-d)*2<n) return;
    //cout << d << endl;
	if (!n)
	{
		for (int i=0; i<10; i++)
		{
			ans[cnt][i]=it[i];
		}
		//cout << endl;
		cnt++;
		return;
	}
	for (int i=0; i<=2; i++)
	{
        if(i<=n&&it[d]+i<=3)
        {
            it[d]+=i;
            n-=i;
            solve(d+1);
            n+=i;
            it[d]-=i;
        }        
  	}
}

int main ()
{
	scanf("%d", &n);
	av=n/10;
	//n-=10;
	//cout << av << ' ' << av*10 << ' '  << n << endl;
	if (av>3||(av==3&&n-av*10!=0))
	{
		cout << 0;
		return 0;
	}
	for (int i=0; i<10; i++)
	{
		it[i]=1;
	}
    n-=10;
	//for (int i=0; i<10; i++) cout << ans[i] << ' ';
	solve(0);
	cout << cnt << endl;
	for (int i=0; i<cnt; i++)
	{
		for (int j=0; j<10; j++)
		{
			cout << ans[i][j] << ' ';
		}
		cout << endl;
	}

	//cout << av << ' ' << av*10 << ' '  << n << endl;
	return 0;
}

2023/10/3 17:16
加载中...