A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
(15分)
深搜
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> using namespace std; char s[9] = "AA223344",ans[9] = "443322AA",ant[9] = "AA223344"; int p[5],q[5],visited[5];///每个牌有两张 p记录靠前位置的牌的位置,q记录同一种牌靠后位置的位置,visited记录每种牌访问程度 最多访问两次。 int check() { if(q[1] - p[1] != 2)return 0; if(q[2] - p[2] != 3)return 0; if(q[3] - p[3] != 4)return 0; if(q[4] - p[4] != 5)return 0; return 1; } void dfs(int k) { if(k == 8) { if(check() && strcmp(ans,ant) > 0)strcpy(ans,ant); return; } for(int i = 1;i <= 4;i ++) { if(visited[i] != 2) { visited[i] ++; if(i == 1)ant[k] = 'A'; else ant[k] = i + '0'; if(visited[i] == 1)p[i] = k; else q[i] = k; dfs(k + 1); visited[i] --; } } } int main() { dfs(0); cout<<ans; }
2019备战重做,一共四种卡片,每种两张,不分你我,两张卡片的距离时固定的,所以同时放两张牌。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define inf 0x3f3f3f3f using namespace std; int d[4] = {3,4,5,2}; bool vis[8]; char ans[9] = "33221100"; char t[9] = "00112233"; void print(char *s) { for(int i = 0;i < 8;i ++) if(s[i] < '3') putchar(s[i] + 2); else putchar('A'); putchar(' '); } void dfs(int k) { if(k >= 4) { if(strcmp(t,ans) < 0) strcpy(ans,t); return; } for(int i = 0;i < 8;i ++) { if(vis[i] || i + d[k] >= 8 || vis[i + d[k]]) continue; vis[i] = true; vis[i + d[k]] = true; t[i] = t[i + d[k]] = '0' + k; dfs(k + 1); vis[i + d[k]] = false; vis[i] = false; } } int main() { dfs(0); print(ans); }