Poj1166
POJ1166的题目链接:http://
在下是一个新手,正在学习搜索,这是
一道深搜“水”题(对我来说不是)。
理解题意但是不知道怎么入手(枚举除外),在看一个博客的结题报告,其中有些地方不明白,在此请教各位
其代码如下:
#include<stdio.h>
#include<string.h>
int move[9][9]={ //记录口令对每个钟表时刻的影响
{1,1,0,1,1,0,0,0,0},
{1,1,1,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0},
{1,0,0,1,0,0,1,0,0},
{0,1,0,1,1,1,0,1,0},
{0,0,1,0,0,1,0,0,1},
{0,0,0,1,1,0,1,1,0},
{0,0,0,0,0,0,1,1,1},
{0,0,0,0,1,1,0,1,1}
};
int num[9],tmp[9],In_dial[9];//num[i]保存指令i的作用次数
int finished;
int judge() //判断是否将所有的时刻拨到了12点
{
int i,j;
for(i=0;i<9;i++)
tmp[i]=In_dial[i];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
tmp[i]=(tmp[i]+move[j][i]*num[j])%4;
for(i=0;i<9;i++)
if(tmp[i])
return 0;
return 1;
}
void output() //输出拨动的最短序列
{
int i,j;
for(i=0;i<9;i++)
for(j=0;j<num[i];j++)
printf("%d ",i+1);
printf("\n");
}
void dfs(int opration)
{
int i;
if(judge())
{
finished=1;
output();
return;
}
if(opration>=9)
return ;
for(i=0;i<4;i++)
{
num[opration]=i;
dfs(opration+1);
if(finished)
return ;
}
}
void main()
{
int i;
for(i=0;i<9;i++)
scanf("%d",&In_dial[i]);
memset(num,0,sizeof(num));
finished=0;
dfs(0);
return ;
}
for(i=0;i<4;i++)
{
num[opration]=i;
dfs(opration+1);
if(finished)
return ;
}
这里不解为什么要在一个循环进行深搜,已经纠结了快一个星期了,望各位指教,菜鸟感激不尽