:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
想法:一个数一个数的填上去,然后不能满足填上去条件的就return回来。暴力解决。
#include<stdio.h>
int a[10]={0},b[10],count=0;
void fun(int c)
{
int n=c-1;
if(n==1)
if(b[n]==b[0]+1||b[n]==b[0]-1)return;
if(n==2)
if(b[n]==b[1]+1||b[n]==b[1]-1)return;
if(n==3)
if(b[n]==b[0]+1||b[n]==b[0]-1)return;
if(n==4){
if(b[n]==b[0]+1||b[n]==b[0]-1)return;
if(b[n]==b[1]+1||b[n]==b[1]-1)return;
if(b[n]==b[3]+1||b[n]==b[3]-1)return;
}
if(n==5)
{
if(b[n]==b[0]+1||b[n]==b[0]-1)return;
if(b[n]==b[1]+1||b[n]==b[1]-1)return;
if(b[n]==b[2]+1||b[n]==b[2]-1)return;
if(b[n]==b[4]+1||b[n]==b[4]-1)return;
}
if(n==6)
{
if(b[n]==b[1]+1||b[n]==b[1]-1)return;
if(b[n]==b[2]+1||b[n]==b[2]-1)return;
if(b[n]==b[5]+1||b[n]==b[5]-1)return;
}
if(n==7){
if(b[n]==b[3]+1||b[n]==b[3]-1)return;
if(b[n]==b[4]+1||b[n]==b[4]-1)return;
}
if(n==8)
{
if(b[n]==b[3]+1||b[n]==b[3]-1)return;
if(b[n]==b[5]+1||b[n]==b[5]-1)return;
if(b[n]==b[4]+1||b[n]==b[4]-1)return;
if(b[n]==b[7]+1||b[n]==b[7]-1)return;
}
if(n==9)
{
if(b[n]==b[4]+1||b[n]==b[4]-1)return;
if(b[n]==b[6]+1||b[n]==b[6]-1)return;
if(b[n]==b[5]+1||b[n]==b[5]-1)return;
if(b[n]==b[8]+1||b[n]==b[8]-1)return;
}
int i;
if(c==10)
{
count++;
return;
}
for(i=0;i<10;i++)
{
if(a[i]==0)
{
a[i]=1;
b[c]=i;
fun(c+1);
a[i]=0;
}
}
}
int main()
{
fun(0);
printf("%d",count);
return 0;
}
答案1680