0 1 2 3 4 5 6 7 8 9
_ _ _ _ _ _ _ _ _ _
在横线上填写数字,使之符合要求。
要求如下:对应的数字下填入的数,代表上面的数在下面出现的次数,比如3下面是1,代表3要在下面出现一次。
正确答案是:0 1 2 3 4 5 6 7 8 9
_ _ _ _ _ _ _ _ _ _
在横线上填写数字,使之符合要求。
要求如下:对应的数字下填入的数,代表上面的数在下面出现的次数,比如3下面是1,代表3要在下面出现一次。
正确答案是:0 1 2 3 4 5 6 7 8 9
6 2 1 0 0 0 1 0 0 0
这个问题下面的结果肯定等于n,上面乘下面的和也是为n的,所以用搜索
可以剪枝,其实最后两个数肯定会是0,此问题感觉并没有完全解决,下次
在更新吧。
#include <stdio.h>
const int maxn = 15;
int a[maxn], vis[maxn], ans[maxn], n;
int is_ok ( )
{
for ( int i = 0; i < n; i ++ )
if ( ans[i] != vis[i] )
return 0;
return 1;
}
void print ( )
{
for ( int i = 0; i < n; i ++ )
printf ( "%d ", ans[i] );
printf ( "\n" );
}
void dfs ( int k, int n, int s )
{
if ( s > n ) //剪枝
return ;
if ( k == n )
{
if ( s == n && is_ok ( ) )
print ( );
return ;
}
for ( int i = 0; i < n; i ++ )
{
ans[k] = i;
vis[i] ++;
dfs ( k+1, n, s+i );
vis[i] --; //回溯
}
}
int main ( )
{
n = 13; //其实最后两个数肯定是0
dfs ( 0, n, 0 );
return 0;
}