zoukankan      html  css  js  c++  java
  • 一道推理题——暴力搜索

    题目

     分析

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

  • 相关阅读:
    【模板】Sparse-Table
    UVa 11235 Frequent values
    【模板】树状数组
    UVa 1428 Ping pong
    数学技巧
    UVa 11300 Spreading the Wealth
    UVa 11729 Commando War
    UVa 11292 Dragon of Loowater
    POJ 3627 Bookshelf
    POJ 1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/lfri/p/11440183.html
Copyright © 2011-2022 走看看