• 一道推理题——暴力搜索


    题目

     分析

    枚举所有的答案,然后再判断,复杂度为 ${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

  • 相关阅读:
    散点图增加趋势线
    asp.net自动刷新获取数据
    jQuery在asp.net中实现图片自动滚动
    tornado 学习笔记一:模板
    node.js 学习笔记二:创建属于自己的模块
    mysql 5.6 innodb memcache 操作学习一
    unicode,str
    node.js 学习笔记四:读取文件
    gevent 学习笔记一
    while 循环居然可以用else
  • 原文地址:https://www.cnblogs.com/lfri/p/11440183.html
Copyright © 2020-2023  润新知