/*
每张牌都要正面朝上,每张牌最多只可能翻动一次
朴素做法是暴力深搜。枚举每张牌翻与不翻。
*/
#include
#include
#include
using namespace std;
char A[100];
bool map[100];
int step,len;
bool flag;
bool judge()
{
for(int i=1;i<=len;i++)
{
if(map[i]!=0)return 0;
}
return 1;
}
void flip(int u)
{
map[u-1]=!map[u-1];
map[u]=!map[u];
map[u+1]=!map[u+1];
}
void dfs(int u,int deep)
{
if(deep==step)
{
flag=judge();
return;
}
if(flag||u>len)return;
flip(u);
dfs(u+1,deep+1);
flip(u);
dfs(u+1,deep);
}
int main()
{
while(cin>>A)
{
flag=false;
len=strlen(A);
for(int i=1;i<=len;i++)
{
map[i]=(A[i-1]=='1');//map[i]=i表示正面朝上
}
//最多翻len-1次
for(step=0;step<=len;step++)
{
dfs(1,0);
if(flag)break;
}
if(flag)printf("%d\n",step);
else printf("NO\n");
}
return 0;
}
高效做法是枚举第一张牌翻不翻,接下来的操作也就确定了。。
#include
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f3f
bool vis[28];
bool val[28];
char A[28];
inline int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
while(cin>>A)
{
int len=strlen(A);
for(int i=0;i
接下来是POJ1753.是类型题。做法很多。先上暴力深搜。回头再更新0-1集合和枚举法。不然代码多了有点乱。
Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
#include
#include
using namespace std;
bool map[6][6],flag;
int step;
int heng[]={-1,1,0,0,0};
int zong[]={0,0,0,1,-1};
bool judge()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(map[i][j]!=map[1][1])
{
return 0;
}
}
}
return 1;
}
void flip(int r,int c)
{
for(int i=0;i<5;i++)
{
map[r+heng[i]][c+zong[i]]=!map[r+heng[i]][c+zong[i]];
}
}
void dfs(int r,int c,int deep)
{
if(deep==step)
{
if(judge())
{
flag=1;
}
return;
}
if(r>4||flag)return;
flip(r,c);
if(c<4)
{
dfs(r,c+1,deep+1);
}
else dfs(r+1,1,deep+1);
flip(r,c);
if(c<4)
{
dfs(r,c+1,deep);
}
else dfs(r+1,1,deep);
}
int main()
{
flag=false;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
map[i][j]=(getchar()=='b');
}
getchar();
}
for(step=0;step<=16;step++)
{
dfs(1,1,0);
if(flag)break;
}
if(flag)printf("%d\n",step);
else printf("Impossible\n");
}