您的位置:首页 > 其它

poj2965解题报告

2015-09-12 11:05 357 查看

摘要:这个题和翻棋盘的题目几乎一样,注意差别在于需要输出路径,因此DFS使得编程方便.注意如果使用BFS,你很难去记录每条路径上所做的决策.

#include "iostream"
#include "string.h"
using namespace std;
int minroute[16],board[16];
int Minstep = 17;
bool success()
{
for(int i = 0;i<=15;i++)
{
if(board[i]!=1)//每一个开关都要处于1(open)
return false;
}
return true;
}
void flip(int index)
{
int i,j;
board[index] = !board[index];
i= index/4, j = 0;
while(j<=3)
{
board[i*4+j] = !board[i*4+j];
j++;
}
j = index-4*i, i = 0;
while(i<=3)
{
board[i*4+j] = !board[i*4+j];
i++;
}
}
void Find(int index,int step,int route[16])//top用来存储路径的下标
{
if(success())
{
if(step < Minstep)
{
memcpy(minroute,route,sizeof(int)*step);
minroute[step] = -1;
Minstep = step;
}
return;
}
if(  index==16)
{
return;
}
flip(index);
route[step] = index;
Find(index+1,step+1,route);//本次翻转
flip(index);
Find(index+1,step,route);//本次不翻转
}
int main()
{
char c;
for(int i = 0;i<=3;i++)
{
for(int j =0;j<=3;j++)
{
cin >> c;
if(c == '+')
board[i*4+j] = 0;
else
board[i*4+j] = 1;//开
}
}

int route[16];
int row,col;
Find(0,0,route);
cout<<Minstep<<endl;
for(int index = 0;minroute[index]!=-1;index++)
{
row = (minroute[index])/4;
col = minroute[index] -row*4;
cout<<row+1<<' '<<col+1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: