赞
踩
解题思路:
采用回溯算法,用一个矩阵来表示逻辑图的操作结果,矩阵中的每一个位置的元素由其上一行的元素进行操作(与或异或)而来,每个元素共执行三种操作。递归到最后时判断是否满足条件+1
代码展示:
注意,本题的输入为 IN[0] = 1,IN[1] = 0,IN[2] = 1,IN[3] = 0,IN[4] = 1
,第一次做蓝桥杯填空题,还以为有多个样例,其实这里只根本不用输入,因为只有一个样例,自己赋值就好。
#include <bits/stdc++.h> using namespace std; // 递归生成矩阵元素 /* 10101 0000 000 00 0 */ int ans = 0; void backTracing(vector<vector<int>>& matrix, int x, int y) { // 递归完成 if (y == matrix.size()) { // 如果当前结果符合条件,则+1 if (matrix[y - 1][x] == 1) ans++; return; } for (int i = 0; i <= 2; i++) { if (i == 0) { matrix[y][x] = (matrix[y - 1][x] == 1 && matrix[y - 1][x + 1] == 1) ? 1 : 0; } else if (i == 1) { matrix[y][x] = (matrix[y - 1][x] == 1 || matrix[y - 1][x + 1] == 1) ? 1 : 0; } else { matrix[y][x] = (matrix[y - 1][x] != matrix[y - 1][x + 1]) ? 1 : 0; } if (x == matrix.size() - y - 1) { // 当前行元素赋值完毕,进入到下一行 backTracing(matrix, 0, y + 1); } else { // 继续当前行 backTracing(matrix, x + 1, y); } } } // 请将输入替换为以下这行 // IN[0] = 1,IN[1] = 0,IN[2] = 1,IN[3] = 0,IN[4] = 1 int main() { // 请在此输入您的代码 string s; getline(cin, s); vector<int> data; for (int i = 0; i < s.size(); i++) { if (s[i] == '=') { data.push_back(stoi(string(s.begin() + i + 1, s.begin() + i + 3))); } } vector<vector<int>> matrix(data.size(), vector<int>(data.size(), 0)); matrix[0] = data; backTracing(matrix, 0, 1); std::cout << ans << std::endl; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。