一道推理题——暴力搜索
题目
分析
枚举所有的答案,然后再判断,复杂度为 ${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("\n"); } 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
个性签名:时间会解决一切