poj1753 Flip Game 解题报告

现附上原题连接:http://poj.org/problem?id=1753

题目的大意识这样:

     给一个棋盘,4*4大小,上面放上正反面各为黑、白的棋子,现有如下操作:

    1、在其中选一棋子,完成反转操作,反转后,棋子颜色改变为其对立颜色。

    2、凡是反转一枚棋子,其上下左右邻近位置的棋子均要翻面。

    问:给定一种状态下的局面,需要翻至少几个棋子,会使棋盘全是白色或全是黑色。

    输入:w:白色,b:黑色。

    输出:1、反转个数。

               2、impossible。

    思路:可以枚举所有情况,反转的次数一定不会大于16次,因为棋盘的棋子个数就为16。可以证明,当超过16次时,会重复前面的情况。那么这样,我们可以通过深搜,来实现对所有情况的枚举。

    策略:对所给状态,进行在1到16各次数下的深搜,如果得到终态(即黑或白的情况)就得出结果。注意初始态就为终态的情况,此时反转次数为0.

    代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int mat[4][4];
int flag,step;
void init_graph(){
    char c;
    for(int i=0;i<4;i++){
       if(i)getchar();
      for(int j=0;j<4;j++){
        scanf("%c",&c);
        if(c=='b')mat[i][j]=0;
        else if(c=='w')mat[i][j]=1;
      }
    }

}
void test()
{
    for(int i=0;i<4;i++){
     if(i)printf("\n");
     for(int j=0;j<4;j++)
      printf("%d",mat[i][j]);
    }
}
int judge(){
    for(int i=0;i<4;i++)
     for(int j=0;j<4;j++)
      if(mat[i][j]!=mat[0][0])return 0;
    return 1;
}
void alter(int i,int j){
    mat[i][j]=!mat[i][j];
    if(i>0)mat[i-1][j]=!mat[i-1][j];
    if(i<3)mat[i+1][j]=!mat[i+1][j];
    if(j>0)mat[i][j-1]=!mat[i][j-1];
    if(j<3)mat[i][j+1]=!mat[i][j+1];
}
void dfs(int i,int j,int tmp){
   if(tmp==step){
   flag=judge();
   return ;
   }
   if(flag||i==4)return ;
   alter(i,j);
   if(j<3)dfs(i,j+1,tmp+1);
   else dfs(i+1,0,tmp+1);
   alter(i,j);
   if(j<3)dfs(i,j+1,tmp);
   else dfs(i+1,0,tmp);
}
int main(){
    //ifstream in("text.txt");
    init_graph();
    //test();
    for(step=0;step<=16;step++)
    {
        flag=0;
        dfs(0,0,0);
        if(flag)break;
    }
    if(flag)printf("%d\n",step);
    else printf("Impossible\n");
    return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值