【题目描述】
有两堆卡片,每堆卡片有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] 来记录状态
每次拿出两张卡片 如果当前状态已经搜到过 直接退出当前搜索
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) {;}