算法学习之路|翻转棋

简介: 4*4的翻转棋(翻一个棋子的颜色会同时反转上下左右的棋子颜色),给一个棋盘状况,求把所有棋子翻成同色最少需要翻多少次 输入格式:输入4*4的棋盘,b’代表黑,w代表白

4*4的翻转棋(翻一个棋子的颜色会同时反转上下左右的棋子颜色),给一个棋盘状况,求把所有棋子翻成同色最少需要翻多少次
输入格式:输入4*4的棋盘,b’代表黑,w代表白

输出格式:输出一个数字,表示最少翻多少次,没有解就输出Impossable

输入样例:
bwwb
bbwb
bwwb
bwww

输出样例:
4
解题思路:经典的搜索题,深搜即可。
刚学搜索时写过,但没有ac,重写一次

#include<stdio.h>  
#include<iostream>
#include<algorithm>
using namespace std;  
int chess[4][4];  
int c=33;  
void build()
{  
    char c;  
    int i,j;  
    for(i=0;i<4;i++)  
    for(j=0;j<4;j++)  
    {  
        cin>>c;
        if(c=='w')  
        chess[i][j]=0;  
        else  
        chess[i][j]=1;  
    }  
}  
void turn(int x,int y) 
{  
    if(x>=0&&x<=3&&y>=0&&y<=3)  
    chess[x][y]=!chess[x][y];  
}  
void flip(int s)
{  
    int i=s/4; 
    int j=s%4;
    turn(i,j);  
    turn(i+1,j);  
    turn(i,j+1);  
    turn(i-1,j);  
    turn(i,j-1);  
}  
int judge()
{  
    int i,j,s1=0;  
    for(i=0;i<4;i++)  
        for(j=0;j<4;j++)  
            s1+=chess[i][j];  
    if(s1%16)  
        return 0;  
    else  
        return 1;  
}  
void dfs(int s,int b)
{  
    if(judge()) 
    {  
        if(c>b)  
            c=b;  
        return;  
    }  
    if(s>=16)
        return;  
    dfs(s+1,b);  
    flip(s);  
    dfs(s+1,b+1);  
    flip(s);  
}  
int main()  
{  
    build();
    dfs(0,0);  
    if(c==33)
        printf("Impossible\n");  
    else  
        printf("%d\n",c);  
    return 0;  
}  
目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 搜索推荐
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
|
2月前
|
算法 网络协议 Linux
【Cisco Packet Tracer】交换机的自学习算法
【Cisco Packet Tracer】交换机的自学习算法
51 0
|
3月前
|
算法 安全 数据安全/隐私保护
C/C++学习 -- RSA算法
C/C++学习 -- RSA算法
30 0
|
3月前
|
存储 JavaScript 算法
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
26 0
|
3月前
|
机器学习/深度学习 算法
机器学习 - [集成学习]Bagging算法的编程实现
机器学习 - [集成学习]Bagging算法的编程实现
32 1
|
29天前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
|
30天前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
30天前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
1月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
30 0
|
1月前
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
43 0