P2089 烤鸡
题解
显然这道题可以用DFS做
注意
我出现的问题真是太low了
(1)DFS要return啊要return啊,不然它不就卡在那个循环里出不来了嘛!!
(2)要判断无解啊!!不仅是一开始的美味值过大,还有美味值超了但是调料没加完,调料加完了美味值不够
(3)先存res==0&&k==11的合法答案啊,不合法再return啊,不然一个 || 判断直接就无解了
代码
#include<bits/stdc++.h> using namespace std; int n,num; int kaoji[11][4],ans[10010][11],a[11]; bool vis[11][4]; void dfs(int res,int k) { if(res==0&&k==11) { num++; for(int i=1;i<=10;i++) ans[num][i]=a[i]; return ; } if(res==0) return ; if(k==11) return ;
for(int i=1;i<=3;i++) { if(!vis[k][i]) { res-=kaoji[k][i]; vis[k][i]=1; a[k]=kaoji[k][i]; dfs(res,k+1); res+=kaoji[k][i]; vis[k][i]=0; a[k]=0; } } } int main() { scanf("%d",&n); if(n>30||n<0) { printf("0 "); return 0; } for(int i=1;i<=10;i++) for(int j=1;j<=3;j++) kaoji[i][j]=j; dfs(n,1); printf("%d ",num); for(int i=1;i<=num;i++) { for(int j=1;j<=10;j++) printf("%d ",ans[i][j]); printf(" "); } }