一道推理题——暴力搜索

题目

 分析

枚举所有的答案,然后再判断,复杂度为 ${10}^5$。

对于每个可能的答案,如果不符合某个条件,则返回false。

我也不知道题干是按 “充分必要条件” 处理还是 “必要条件处理”,反正没用完所有条件就出结果了。

#include<bits/stdc++.h>
using namespace std;
int a[10+5];


bool judge()
{
    //第三题
    if(a[3] == 0)
    {
        if(a[3] == a[6])  return false;
        if(!(a[6] == a[2] && a[2] == a[4]))  return false;

    }
    if(a[3] == 1)
    {
        if(a[6] == a[3])  return false;
        if(!(a[3] == a[2] && a[2] == a[4]))  return false;
    }
    if(a[3] == 2)
    {
        if(a[2] == a[3])  return false;
        if(!(a[3] == a[6] && a[6] == a[4]))  return false;
    }
    if(a[3] == 3)
    {
        if(a[4] == a[3])  return false;
        if(!(a[3] == a[6] && a[6] == a[2]))  return false;
    }


    //第四题
    if(a[4] == 0)
    {
        if(a[1] != a[5])  return false;
        if((a[2] == a[7]) || (a[1] == a[9]) || (a[6] == a[10]))  return false;
    }
    if(a[4] == 1)
    {
        if(a[2] != a[7])  return false;
        if((a[1] == a[5]) || (a[1] == a[9]) || (a[6] == a[10]))  return false;
    }
    if(a[4] == 2)
    {
        if(a[1] != a[9])  return false;
        if((a[1] == a[5]) || (a[2] == a[7]) || (a[6] == a[10]))  return false;
    }
    if(a[4] == 3)
    {
        if(a[6] != a[10])  return false;
        if((a[1] == a[5]) || (a[2] == a[7]) || (a[1] == a[9]))  return false;
    }

    //第五题
    if(a[5] == 0)
    {
        if(a[8] != a[5])  return false;
        if((a[4] == a[5]) || (a[9] == a[5]) || (a[7] == a[5]))  return false;
    }
    if(a[5] == 1)
    {
        if(a[4] != a[5])  return false;
        if((a[8] == a[5]) || (a[9] == a[5]) || (a[7] == a[5]))  return false;
    }
    if(a[5] == 2)
    {
        if(a[9] != a[5])  return false;
        if((a[8] == a[5]) || (a[4] == a[5]) || (a[7] == a[5]))  return false;
    }
    if(a[5] == 3)
    {
        if(a[7] != a[5])  return false;
        if((a[8] == a[5]) || (a[4] == a[5]) || (a[9] == a[5]))  return false;
    }

    //第六题
    if(a[6] == 0)
    {
        if((a[2] != a[8]) || (a[4] != a[8]))  return false;
    }
    if(a[6] == 1)
    {
        if((a[1] != a[8]) || (a[6] != a[8]))  return false;
    }
    if(a[6] == 2)
    {
        if((a[3] != a[8]) || (a[10] != a[8]))  return false;
    }
    if(a[6] == 3)
    {
        if((a[5] != a[8]) || (a[9] != a[8]))  return false;
    }

    //第七题
    int tmp[4];
    for(int i = 0;i < 4;i++)  tmp[i] = 0;
    for(int i = 1;i <= 10;i++)  tmp[a[i]]++;
    int minn = tmp[0], index=0;
    for(int i = 0;i < 4;i++)
    {
        if(tmp[i] < minn)
        {
            minn = tmp[i];
            index = i;
        }
    }
    if(a[7] == 0)  if(index != 2)  return false;
    if(a[7] == 1)  if(index != 1)  return false;
    if(a[7] == 2)  if(index != 0)  return false;
    if(a[7] == 3)  if(index != 3)  return false;

    //第八题
    if(a[8] == 0) if(abs(a[7]-a[1]) <= 1)  return false;
    if(a[8] == 1) if(abs(a[5]-a[1]) <= 1)  return false;
    if(a[8] == 2) if(abs(a[2]-a[1]) <= 1)  return false;
    if(a[8] == 3) if(abs(a[10]-a[1]) <= 1)  return false;

    //第九题
    if(a[9] == 0)  if(!((a[1] == a[6]) ^ (a[6] == a[5])))  return false;
    if(a[9] == 1)  if(!((a[1] == a[6]) ^ (a[10] == a[5])))  return false;
    if(a[9] == 2)  if(!((a[1] == a[6]) ^ (a[2] == a[5])))  return false;
    if(a[9] == 3)  if(!((a[1] == a[6]) ^ (a[9] == a[5])))  return false;

    //第十题
    int maxx = tmp[0];
    for(int i = 0;i < 4;i++)
    {
        if(tmp[i] > maxx)  maxx = tmp[i];
    }
    int cha = maxx - minn;
    if(a[10] == 0)  if(cha != 3)  return false;
    if(a[10] == 1)  if(cha != 2)  return false;
    if(a[10] == 2)  if(cha != 4)  return false;
    if(a[10] == 3)  if(cha != 1)  return false;

    return true;
}

void dfs(int cur)
{
    if(cur > 10)
    {
        if(judge())
        {
            for(int i = 1;i <= 10;i++)  printf("%d ", a[i]);
            printf("
");
        }
        return;
    }
    for(int i = 0;i < 4;i++)
    {
        a[cur] = i;
        dfs(cur+1);
    }
}

int main()
{
   dfs(1);
   return 0;
}

两年前第一次看到这个,就想用程序解决,可是当时C语言都才开始学。

转眼就两年,貌似自己有没什么进步,哎哎

参考链接:https://blog.csdn.net/u011412840/article/details/79477923

原文地址:https://www.cnblogs.com/lfri/p/11440183.html