0
已解决
姚天宇
高级光能
高级光能
6134 填数游戏
60分:
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
long long n,m,a[15][15];//a表示填的数
/*
3 1 2 4
0 4 3 6
0 0 7 9
0 0 0 16
*/
bool f[1000001];
void dfs(int x){//填的是第几个数
if(x==n+1){//如果n个数填完
/*
递归:
边界:a[1][1]~a[1][n]
状态转移方程:a[i][j]=a[i-1][j]+a[i-1][j-1]
目标:a[n][n]
*/
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
a[i][j]=a[i-1][j]+a[i-1][j-1];//状态转移方程
}
}
if(a[n][n]==m){//a[n][n]是这n个数经过流程得到的和,判断和是不是m
//找到1组解,并且字典序最小
//输出&&结束程序
for(int i=1;i<=n;i++){
cout<<a[1][i]<<" ";
}
exit(0);//结束程序
}
return ;
}
for(int i=1;i<=10;i++){//填的数是1~10(不确定)
if(f[i]==0){//当前数没有被填
//搜索
a[1][x]=i;//填数
f[i]=1;//当前数设置状态为填过
dfs(x+1);//填下一个数
//回溯
a[1][x]=0;
f[i]=0;
}
}
}
int main(){
cin>>n>>m;
dfs(1);//从第1行开始填
return 0;
}
注释加了,样例对了,60分了
…………………………………………………………………………
姚天宇在2023-09-23 20:27:40追加了内容
送豆,乙解决