QAQ心态崩了……这个题=-=有毒……理解的时候出了点小问题orz(○| ̄|_)
题意大概是输出从1开始可以连续表示的数的最后一个数(n个魔方表示一个数的时候不能重复使用)
注意:0不是一定要有的……从1开始判断就可以了
(因为一开始判断了有没有0……gg了……一直WA)
emmmm这里贴两份代码好了,一份是模拟,另一份……暴力dfs!(看到别人代码才发现原来还可以这样写,代码简洁了好多,开心!o(* ̄▽ ̄*)ブ)
dfs:
#include<string> #include<iostream> using namespace std; int c[5][15]; bool vis[1005], b[5]; int n, a; void dfs(int p,int s) { vis[s] = 1; //可以表示数s,emmmm,0就不用管了 if (p >= n) return; //所用魔方的个数 for (int i = 1; i <= n; i++) { if (b[i])continue; for (int j = 0; j < 6; j++) { b[i] = 1; //第i个魔方已用过 dfs(p + 1, s * 10 + c[i][j]); b[i] = 0; //回溯 } } } int main() { cin >> n; for (int i = 1; i <= n; i++) for (int j = 0; j < 6; j++) cin >> c[i][j]; memset(vis, 0, sizeof(vis)); memset(b, 0, sizeof(b)); dfs(0, 0); int i; for (i = 1; i < 1000; i++) if (!vis[i]) break; cout << i - 1 << endl; return 0; }
模拟:
#include<string> //orz这就叫,智商不够代码来凑……(○| ̄|_ ) #include<iostream> using namespace std; bool c[5][15]; int n, a; int main() { cin >> n; memset(c, 0, sizeof(c)); for (int i = 1; i <= n; i++) for (int j = 0; j < 6; j++) { cin >> a; c[i][a] = 1; } if (n == 1) { for (int i = 1; i < 10; i++) { if (!c[1][i]) { cout << i - 1 << endl; return 0; } } } if (n == 2) { for (int i = 1; i < 10; i++) { int flag = 0; if (c[1][i] || c[2][i]) flag = 1; if (!flag) { cout << i - 1 << endl; return 0; } } for (int i = 10; i < 100; i++) { int flag = 0; a = i / 10; int b = i % 10; if (c[1][a] && c[2][b]) flag = 1; if (c[1][b] && c[2][a])flag = 1; if (!flag) { cout << i - 1 << endl; return 0; } } } if (n == 3) { for (int i = 1; i < 10; i++) { if (!c[1][i] && !c[2][i] && !c[3][i]) { cout << i - 1 << endl; return 0; } } for (int i = 10; i < 100; i++) { int flag = 0; a = i / 10; int b = i % 10; if (c[1][a] && c[2][b]) flag = 1; else if (c[1][b] && c[2][a])flag = 1; else if (c[1][a] && c[3][b]) flag = 1; else if (c[1][b] && c[3][a])flag = 1; else if (c[2][a] && c[3][b]) flag = 1; else if (c[2][b] && c[3][a])flag = 1; if (!flag) { cout << i - 1 << endl; return 0; } } } }