用回溯法搞了好久没搞出来,求别的方法
彩灯问题,N个等串在一起,每一个灯的颜色都不相同,问这个灯有多少颜色的组合,并且将他们输出来,如N=2,颜色有blue ,black两种,输出为2 blue black,black ,blue。我是想学N皇后问题来做的,错误挺多,不知道怎么改,能帮忙看看吗?语法错的多,我用数字表示颜色的不是字符串。。。。。
#include "stdio.h"
int N;
void lights(int N)
{ int i;
int a[10],b[10];//a[n],b[n]的值为灯的颜色
for(i=0;i<N;i++)//输入颜色
scanf("%d",&b[i]);
for(i=0;i<N;i++)
a[i]=b[0];//先赋初值,全赋b[0]颜色
}
int conflict(int a,int b)
{
int i,j,t,N;
for(i=t;i<N;i++)//是否冲突,冲突返回0.不冲突返回1,比较a[i]与它之前的所有的灯的颜色,如果相同则冲突
for(j=i;j>=0;j--)
{
if(i<N)
{
if(a[i]==a[j])
{
a[i]=b[i+1];
return 0;
}
}
}
return 1;
}
void input(int a)
{
int i;
for(i=0;i<N;i++)
{
a[i];
}
}
int answer(int b,int a)
{
int j=1,t;
for(t=1;;t++,j++)//冲突a[i]移至下一颜色,不冲突则比较a[i+1],待i加到n-1时,输出,找到一个解以后将a[0移位],以此类推
{
if(t<N)
{
if(conflict(a[t]))
continue;
else if(!conflict(a[t]))//如果冲突,a[t]被赋于下一颜色
{a[t]=b[j];j++;}
}
//恰好边界则找到可行解,输出
if(t==(N-1))
{
input();
}
}
}
int main(int a,int b)
{
int k;
scanf("%d",&N);
lights(int N);
while(N)//
{
for(k=0;k<N;k++)
{
a[0]=b[k];
answer();
}
}
return 0;
}