方格填数

来源:互联网 发布:科勒有几家网络授权店 编辑:程序博客网 时间:2024/04/30 15:35
/*1160: 方格填数
时间限制: 1 Sec  内存限制: 128 MB
提交: 3  解决: 2
[提交][状态][讨论版]
题目描述
如上面的10个格子,填入0~9的数字,不能重复(原先已经填了一部分数字),要求:连续的两个数字不能相邻(左右,上下,对角都算相邻)。例如:数字0和1不能放在一起。
问:一共有多少种可能的填数方案?
输入
输入多组测试数据。
每组测试数据有三行,第一行三个整数,第二行四个整数,第三行三个整数,之间用空格隔开,分别代表每个空格所填的数,如果原先没有数,则填-1。
输入数据保证不重复数字,不保证连续数字不相邻。
输出
每组测试数据输出一行。
 输出表示方案数目的整数。
样例输入
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1
0 1 -1
-1 -1 -1 -1
-1 -1 -1
1 3 5
-1 -1 -1 -1
-1 -1 -1
样例输出
1580
0
8*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[3][4]={-2},b[10];
int count;
int judge(int x,int y,int m)
{
    if(x>0&&(a[x-1][y]==m+1||a[x-1][y]==m-1))
        return 0;
    if(y>0&&(a[x][y-1]==m+1||a[x][y-1]==m-1))
        return 0; 
if(x>0&&y>0&&(a[x-1][y-1]==m+1||a[x-1][y-1]==m-1))
        return 0;
    if(x>0&&y<3&&(a[x-1][y+1]==m+1||a[x-1][y+1]==m-1))
        return 0;
    return 1;
}
void dfs(int n)
{
int i;
int r=n/4;
int c=n%4;
if(n==11)
{
count++;
return ;
}
if(a[r][c]==-1)
{
  for(i=0;i<=9;i++)
  {
  if(!b[i]&&judge(r,c,i))
  {
  a[r][c]=i;
  b[i]=1;
  dfs(n+1);
  a[r][c]=-1;
  b[i]=0;
            }
}
    }
    else
    {
    if(judge(r,c,a[r][c]))//判断与输入的数之间有没有相邻的 
            dfs(n+1);
    }
}
int main()
{
while(~scanf("%d",&a[0][1]))
{
   memset(b,0,sizeof(b));
   int i;
   if(a[0][1]!=-1)
       b[a[0][1]]=1;
        for(i=2;i<4;i++)
        {
           scanf("%d",&a[0][i]);
           if(a[0][i]!=-1)
               b[a[0][i]]=1;
        }
        for(i=0;i<4;i++)
        {
           scanf("%d",&a[1][i]);
           if(a[1][i]!=-1)
               b[a[1][i]]=1;
        }
        for(i=0;i<3;i++)
        {
           scanf("%d",&a[2][i]);
           if(a[2][i]!=-1)
               b[a[2][i]]=1;
        }
count=0;
   dfs(1);
   printf("%d\n",count);
}
return 0;
}
1 0
原创粉丝点击