Luogu P1764翻转游戏

我代码能力可能有一定的了,要不然不能一遍写出来吧。。

要注意无解的处理!

 1 #include<iostream>
 2 #include<cstdio>
 3
 4 using namespace std;
 5
 6 int a[20][20];
 7 int n,ans = -1,k,cnt0;
 8 char ch;
 9
10 void print(){
11     cout << endl;
12     for(int i = 1;i <= n;i++){
13         for(int j = 1;j <= n;j++)cout << a[i][j];
14         cout << endl;
15     }
16     cout << endl;
17 }
18
19 void touch(int x,int y){
20     a[x-1][y] ^= 1;
21     a[x][y-1] ^= 1;
22     a[x][y] ^= 1;
23     a[x][y+1] ^= 1;
24     a[x+1][y] ^= 1;
25 }
26
27 void work0(){
28     for(int i = 1;i <= n;i++)
29         if((k>>(i-1))&1)a[0][i] = 1;
30         else a[0][i] = 0;
31 }
32
33 void work1(int cur,int cnt){//print();
34     if(cur == n+1){
35         for(int i = 1;i <= n;i++)if(!a[n][i])return;
36         if(ans == -1||ans > cnt)ans = cnt;
37         return;
38     }
39     int v = 0;
40     for(int i = 1;i <= n;i++)if(!a[cur-1][i]){
41         cnt++;
42         touch(cur,i);
43         v |= 1<<(i-1);
44     }
45     work1(cur+1,cnt);
46     for(int i = 1;i <= n;i++)if((v>>(i-1))&1)touch(cur,i);
47 }
48
49 void work2(int cur,int cnt){//print();
50     if(cur == n+1){
51         for(int i = 1;i <= n;i++)if(a[n][i])return;
52         if(ans == -1||ans > cnt)ans = cnt;
53         return;
54     }
55     int v = 0;
56     for(int i = 1;i <= n;i++)if(a[cur-1][i]){
57         cnt++;
58         touch(cur,i);
59         v |= 1<<(i-1);
60     }
61     work2(cur+1,cnt);
62     for(int i = 1;i <= n;i++)if((v>>(i-1))&1)touch(cur,i);
63 }
64
65 int main(){
66     cin >> n;
67     for(int i = 1;i <= n;i++)for(int j = 1;j <= n;j++){
68         cin >> ch;
69         if(ch == ‘b‘)a[i][j] = 1;
70         else a[i][j] = 0;
71     }
72     for(k = 0;k < 1<<n;k++)work0(),work1(1,0),work2(1,0);
73     if(ans != -1)cout << ans;
74     else cout << "Impossible";
75 return 0;
76 }

原文地址:https://www.cnblogs.com/Wangsheng5/p/11569869.html

时间: 2024-10-12 11:25:48

Luogu P1764翻转游戏的相关文章

codevs 2946 翻转游戏

2946 翻转游戏 题目描述 Description 现有n个数字a1,a2...an,其值均为0或1. 要求对着n个数中连续的若干个数进行一次取反(0->1,1->0),求所能得到的最多的1的数目. 输入描述 Input Description 第一行,n 第二行,n个数 输出描述 Output Description 能得到的最多的1的数目 样例输入 Sample Input 41 0 0 1 样例输出 Sample Output 4 数据范围及提示 Data Size & Hin

[Swift]LeetCode293. 翻转游戏 $ Flip Game

You are playing the following Flip Game with your friend: Given a string that contains only these two characters: + and -, you and your friend take turns to flip twoconsecutive "++" into "--". The game ends when a person can no longer

Luogu P1965 转圈游戏

Luogu P1965 转圈游戏 考场上遇到这种题,一定要画图推一下. 不难得到\(ans=(x+m\times 10^k)mod n\). 还有就是用同余定理时一定要仔细思考一下,然后该打快速幂就打. #include<bits/stdc++.h> using namespace std; int n,m,k,x; long long ans; long long quickPower(int b,int p,int k) { long long ans=1; if(!p) { ans=1%

914. 翻转游戏

914. 翻转游戏 中文English You are playing the following Flip Game with your friend: Given a string that contains only two characters: + and -, you can flip two consecutive "++" into "--", you can only flip one time. Please find all strings t

Luogu P1057 传球游戏(dp 递推)

P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视

luogu P1080 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

翻转游戏

原题链接 解法一:枚举+搜索 #include<bits/stdc++.h> using namespace std; int len; string S; bool search(bool state[]) { for(int i=0;i<len-1;i++){ if(state[i]&&state[i+1]){ state[i]=false; state[i+1]=false; if(!search(state)){ state[i]=true; state[i+1]

luogu P1057 传球游戏

题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视作不同的方法,当且仅当

[LeetCode] Flip Game 翻转游戏

You are playing the following Flip Game with your friend: Given a string that contains only these two characters: + and -, you and your friend take turns to flip twoconsecutive "++" into "--". The game ends when a person can no longer