1023

来源:互联网 发布:阳光一百置业 知乎 编辑:程序博客网 时间:2024/05/13 15:29
简单题意:,有A-H 8个圆圈,,给出各个圆圈内的数,0代表你要填的数,让你求要多少种填法;
解题思路,:从第一位开始搜索,位上有数字就跳过,如果没有就搜索:
每到一位的判断关系;
感悟:判断条件情况比较复杂

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
int a[10],vis[10],ans[10],anscnt;
int abs(int q)
{
 if(q<0) return -q;
 return q;
}
int ok()
{
 if(abs(a[2]-a[1])!=1&&
  abs(a[3]-a[1])!=1&&
  abs(a[4]-a[1])!=1&&
  
  abs(a[2]-a[3])!=1&&
  abs(a[2]-a[5])!=1&&
  abs(a[2]-a[6])!=1&&
  
  abs(a[3]-a[4])!=1&&
  abs(a[3]-a[5])!=1&&
  abs(a[3]-a[6])!=1&&
  abs(a[3]-a[7])!=1&&
  
  abs(a[4]-a[6])!=1&&
  abs(a[4]-a[7])!=1&&
  
  abs(a[5]-a[6])!=1&&
  abs(a[5]-a[8])!=1&&
  
  abs(a[6]-a[7])!=1&&
  abs(a[6]-a[8])!=1&&
  
  abs(a[7]-a[8])!=1
  )
  return 1;
 else return 0;
}
void DFS(int k)
{
    int i,cnt=0;
 if(k==9)
  {
   if(ok())
   {
    anscnt++;
    if(anscnt==1)
    {
     for(i=1;i<=8;i++)
      ans[i]=a[i];
    }
   }
   return;
  }
    if(anscnt>=2) return;
    if(a[k]!=0) DFS(k+1);
 else
  for(i=1;i<=8;i++)
  {
   if(!vis[i])
   {
    a[k]=i;
    vis[i]=1;
    DFS(k+1);
    a[k]=0;
    vis[i]=0;
   }
  }
}

int main()
{
 int t,cas=0;
 scanf("%d",&t);
 while(t--)
 {
  anscnt=0;
  int i;
  memset(vis,0,sizeof(vis));
  memset(ans,0,sizeof(ans));
  scanf("%d %d %d %d %d %d %d %d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]);
  for(i=1;i<=8;i++) vis[a[i]]=1;
        DFS(1);
        printf("Case %d: ",++cas);
        if(anscnt==1)
        {
   for(i=1;i<8;i++)  printf("%d ",ans[i]);
   printf("%d\n",ans[i]);
        }
        else if(anscnt==0) printf("No answer\n");
        else printf("Not unique\n");
 }
 return 0;
}

 

 

0 0