首页 > 代码库 > DFS+枚举
DFS+枚举
poj 1753 Flip Game
题目的大概意思是每一次翻动一个格子,他周围的也会跟着进行翻动,看翻动几次可以使所有的格子都变成一种颜色。
4*4的一共16个格子,如果16个格子都被翻转了还是没有达到要求则不可能达成
用DFS深搜来枚举,每次翻动一个格子判断一次是否达成,若满足未达成并且翻转次数没有达到本次要求翻转次数则继续否则就回到上一步翻转另外的格子
核心代码:
findTime(int i,int j,int deep) { if(deep==step) if(isFinished) flag=1 return; if(flag||i==5) return fan(i,j) if(j<5) findTime(i,j+1,deep+1) else findTime(i+1,1,deep+1) fan(i,j) if(j<5) findTime(i,j+1,deep+1) else findTime(i+1,1,deep+1) return; } for(step=0;step<=16;step++) { findTime(1,1,0); if(flag) break; }
总体代码:
#include <iostream> #include <cstdio> using namespace std; char a[5][5]; bool is[5][5]={false}; int times=0; int step; bool flag; bool isfinished() { char x=a[1][1]; for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++) { if(x!=a[i][j]) return false; } } return true; } char change(int i,int j) { if(a[i][j]==‘b‘) return ‘w‘; if(a[i][j]==‘w‘) return ‘b‘; } char fan(int i,int j) { a[i][j]=change(i,j); if(i-1>=1) a[i-1][j]=change(i-1,j); if(j-1>=1) a[i][j-1]=change(i,j-1); if(i+1<=4) a[i+1][j]=change(i+1,j); if(j+1<=4) a[i][j+1]=change(i,j+1); } void findTimes(int i,int j,int deep) { if(step==deep) { flag=isfinished(); printf("%d %d %d\n",step,deep,flag); return; } if(flag||i==5) return; fan(i,j); if(j<4) findTimes(i,j+1,deep+1); else findTimes(i+1,1,deep+1); fan(i,j); if(j<4) findTimes(i,j+1,deep); else findTimes(i+1,1,deep); return; } int main() { freopen("a.txt","rw",stdin); char temp; for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++) { cin>>a[i][j]; } } for(step=0;step<=16;step++) { findTimes(1,1,0); if(flag)break; } if(flag==true) printf("%d",step); else printf("Impossible"); return 0; }
DFS+枚举
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。