#include<cstdio>
#include<cstring>
const int Row=4,Col=4;
int status[Row][Col]={
1,0,0,0,
0,1,1,1,
0,1,1,1,
0,1,1,1
};
int minstep=200;
int nowstep=0;
int steps[200];
int beststeps[200];
void click(int pos)
{
int r=pos/4,c=pos%4;
status[r][c]=!status[r][c];
for(int i=0;i!=Row;i++)
status[i][c]=!status[i][c];
for(int i=0;i!=Col;i++)
status[r][i]=!status[r][i];
steps[pos]=!steps[pos];
}
bool win()
{
for(int i=0;i<Row;i++)
{ for(int j=0;j<Col;j++)
if(!status[i][j])
return false;
}
return true;
}
void DFS(int step)
{
if(step==Row*Col) return;
if(nowstep>=minstep) return;
if(win()) {
minstep=nowstep;memcpy(beststeps,steps,sizeof(beststeps));return;}
DFS(step+1);
nowstep++;
click(step);
DFS(step+1);
nowstep--;
click(step);
}
int main()
{
DFS(0);
printf("%d\n",minstep);
for(int i=0;i<Row*Col;i++)
if(beststeps[i])
printf("(%d,%d) ",i/4+1,i%4+1);
}
点灯游戏求解算法(DFS)——老子表示不理解!也不看了!
最新推荐文章于 2022-03-13 20:42:29 发布