COGS 2598. 美丽的感觉

【题目描述】

有两堆卡片,每堆卡片有n(4 ≤ n ≤ 1000)张,所有卡片中有n张是红色的,n张是蓝色的。现在要将卡片逐张取下,红的放在一起,蓝的放在一起,每堆卡片中只能取最上面的那张,且要求任意时刻,已取得的红色卡片数和蓝色卡片数相差不超过1张,问如何取,才能完成任务?

【输入格式】

第一行一个整数n,表示每堆卡片的张数。第二行有n个字符,表示第一堆的卡片颜色,第三行有n个字符,表示第二堆的卡片颜色。其中0代表红色,1代表蓝色,每行的第1个字符代表最上面的卡片颜色,第n个字符代表最下面的卡片颜色。

【输出格式】

如果存在完成任务的方案 请输出 “Accepted! ”否则 输出 “Impossible!”(无双引号)

【样例输入】

simple1 in:

4

0011

0110

 

simple2 in:

4

1100

1100

【样例输出】

simple1 out:

Accepted!

simple2 out:

Impossible!

【提示】

4 ≤ n ≤ 1000

注意输出时带  ‘!’

思路:DFS 即可 

   由于每次只拿出一个卡片 DFS 会T 两个点 

   我们用dp[i][j] 来记录状态 

   每次拿出两张卡片 如果当前状态已经搜到过 直接退出当前搜索

 1 #include <cstdio>
 2 #include <cctype>
 3 #include <algorithm>
 4 
 5 const int MAXN=1010;
 6 
 7 int n;
 8 
 9 bool dp[MAXN][MAXN];
10 
11 char a[MAXN],b[MAXN];
12 
13 bool DFS(int x,int y) {
14     if(!x&&!y) return true;
15     
16     if(!dp[x][y]) dp[x][y]=true;
17     else return false;
18     
19     if((x-2)>=0 && a[x-1] != a[x] && DFS(x-2,y)) return true;
20     if((y-2)>=0 && b[y-1] != b[y] && DFS(x,y-2)) return true;
21     if((x-1)>=0 && (y-1)>=0 && a[x] != b[y] && DFS(x-1,y-1)) return true;
22     return false;
23 }
24 
25 int hh() {
26     freopen("card_.in","r",stdin);
27     freopen("card_.out","w",stdout);
28     
29     scanf("%d",&n);
30     scanf("%s",a+1);
31     scanf("%s",b+1);
32     
33     if(DFS(n,n)) printf("Accepted!
");
34     else printf("Impossible!
");
35     
36     return 0;
37 }
38 
39 int sb=hh();
40 int main(int argc,char**argv) {;}
代码
原文地址:https://www.cnblogs.com/whistle13326/p/7717966.html