这题和1753几乎是一样的,只是稍微麻烦一点,只需要在深搜时,将改变的步数记录下来就OK了。
题目链接:http://poj.org/problem?id=2965
简单介绍:
也是翻转的操作,只是是在每一个格子翻转后,引起同一行,同一列的格子发生变化。
直接贴代码:
/*
简单枚举
+记为0 ; -记为1 ;
open 65535
*/
#include<cstdio>
#include<iostream>
using namespace std ;
int position[16], posi[16] ;
int f[16] = {4383,8751,17487,34959,4593,8946,17652,35064,7953,12066,20292,36744,61713,61986,62532,63624} ;
int min_times = 16, times = 0 ;
int begin = 0 ;
void DFS(int val,int dep)
{
if( val == 65535 )
{
if( min_times >= times )
{
for( int i = 0; i < 16; i++ )
position[i] = posi[i] ;
min_times = times ;
}
}
if( dep == 16 ) return ;
int temp = val ;
val = val ^ f[dep] ;
times++ ;
posi[dep] = 1 ;
DFS(val,dep+1) ;
times-- ;
posi[dep] = 0 ;
DFS(temp,dep+1) ;
}
int main()
{
char ch ;
for( int i = 0; i < 16; )
{
cin.get(ch) ;
if( ch == '-' )
{
begin += (1<<i) ;
i++ ;
}
else if( ch == '+' )
{
i++ ;
}
}
DFS(begin,0) ;
printf("%d\n",min_times) ;
for( int i = 0; i < 16; i++ )
{
if( position[i] == 1 )
printf("%d %d\n",(i/4)+1,(i%4)+1) ;
}
return 0 ;
}
大家如果有不同的想法,欢迎一起谈论!