算法学习之路|翻转棋

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;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值