上:(x-1,y) 下:(x+1,y) 左:(x,y-1) 右:(x,y+1)
构造2个方向数组dx[]={-1,1,0,0},dy[]={0,0,-1,1};
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
}
void dfs(...........) //参数就是当前点坐标
{
if(找到一个解) {输出; return }
if(到达边界) return;
while(当前状态可能扩展的方向) //就是上下左右
{
if(可扩展) //非0(没走过,不是墙)
{
保存方案,标记,修改......
//保存位置,把这个点改成0
dfs(.....);
还原所有的修改!; //把这个点改回1
}
}
}
------------------------------------------------------------------------我叫分割线-----------------------------------------------------------------------
若用
int que[10]表示队列
int front=0 表示头部
int rear=0 表示尾部
X进队:que[rear++]=X;
取队首:que[front];
出队:front++;
定义队列数组
struct node
{
int x,y; //当前点位置
int dis; //当前走过的距离
.....
}que[maxn],st;
void bfs()
{
que[rear++]=st; //初始状态入队;
while(front<rear)
{
node t = que[front]; //取队头
while(当前状态还能扩展)
{
node f=新状态; //新位置,距离+1....
if(新状态合法)
{
标记;
que[rear++]=f;
}
if(新状态就是终点)
{
print();
return;
}
}
front++;
}
无解
}
-----------------------------------------------------------------------------------又是我------------------------------------------------------------------------
1、init() 初始化
2、find_root() 查找一个元素所在的集合
3、merge(x,y) 合并x、y所在的集合
-----------------------------------------------------------------------------------------大家好-------------------------------------------------------------------
状态转移方程