农夫过河问题 简单的搜索

// 用一个二进制串表示状态0,表示东西或者人在河的这边
// 1表示东西或者人在河的另一边
// 比如0000表示都在起始的位置,1111表示都到了对岸
// 通过状态的转移,来找到路径

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100;
const int inf = 0x7f7f7f7f;
int a[maxn];
int n,m;
int v[4] = {8,4,2,1};
int vis[16];

int get(int x,int i){
	return (x & v[i])==0;
}

bool ok(int x){
	if (get(x,1)==get(x,2) && get(x,0)!=get(x,1)){
		//cout << " 6 " << endl;
		return false;
	}
	if (get(x,2)==get(x,3)&& get(x,0)!=get(x,2)){
		return false;
	}
	return true;
}

bool judge(int l,int n){
	if ((l & v[0])==(n & v[0]))
		return false;
	int cnt = 0;
	for (int i=1;i<=3;i++){
		if (get(l,i)!=get(n,i)){
			cnt++;
		}
	}
	if (cnt>1)
		return false;
	return true;
}

int flag = 0;

void print(int m){
	for (int i=0;i<m;i++){
		for (int j=0;j<4;j++){
			if (a[i] & (1<<j)){
				cout << 1 << " ";
			}else {
				cout << 0 << " ";
			}
		}
		cout << endl;
	}
}

void dfs(int x,int cnt){
//	cout << "x = " << x << " cnt = " << cnt << endl;
	if (flag)
		return ;
	if (x==15){
		print(cnt);
		flag = 1;
		return;
	}
	vis[x] = 1;
	for (int i=15;i>=1;i--){
		if (!vis[i] && ok(i)&& judge(x,i)){
			a[cnt] = i;
			dfs(i,cnt+1);
			a[cnt] = 0;
		}
	}
}

void init(){
	memset(vis,0,sizeof(vis));
	dfs(0,1);
}

int main(){
	init();
}

时间: 2024-08-08 09:40:47

农夫过河问题 简单的搜索的相关文章

数据结构设计——农夫过河问题

农夫过河问题 1. 问题描述: 设有一个农夫带一只狼,一只羊和一筐菜来到河边,打算乘一只船从右岸渡到左岸去.该船的负载能力为农夫每次只能带一样东西过河.在无农夫的时候,狼和羊不能在一起,羊和菜不能在一起.设计一个方案,使农夫可以无损失地渡过河. 2. 设计思路: 设计好图的结构,点以(农夫,狼,羊,菜)表示,设置图的点集,边集,点数,边数: 用is_safe函数确定图中各点是否安全,将不安全的点去掉,剩下安全的点,然后判断两点之间是否可变换,再通过层次遍历找到路径,设定好参数,打印出路径: 3.

农夫过河问题算法设计与实现

一个农夫带着-只狼.一只羊和-棵白菜,身处河的南岸.他要把这些东西全部运到北岸.他面前只有一条小船,船只能容下他和-件物品,另外只有农夫才能撑船.如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜.请求出农夫将所有的东西运过河的方案. 实现上述求解的搜索过程可以采用两种不同的策略:一种广度优先搜索,另一种深度优先搜索.这里介绍在广度优先搜索方法中采用的数据结构设计. 程序源码: /*************

ZOJ2165 简单DFS搜索

1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #define MAXN 25 6 using namespace std; 7 int h,w; 8 int ans; 9 int dir[4][2]={-1,0,1,0,0,-1,0,1}; 10 char map[MAXN][MAXN]; 11 12 bool ok(int x,int

jquery实现简单的搜索

对一个简单的ul列表进行输入框的搜索功能,搜索之前及搜索后显示效果如下: 用到的主要jquery技术有filter()和match()方法以及正则匹配,基础HTML+div设置: <div class="nav_Element_Item "> <h2>数据名称:</h2> <div class="data_search_div"> <input class="data_search_input"

农夫过河

#include <iostream>//#include <windows.h>#define STEP 20using namespace std;int m=0,n=0;/*m为take函数执行次数,n为for循环次数*/int a[STEP][4];/*0狼 1羊 2菜 3人*/int b[STEP];int count = 0;void disp(int s, int n);void take(int step);void farmer() { int i, j; for

[ZOJ 1002] Fire Net (简单地图搜索)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002 题目大意: 给你一个n*n的地图,地图上的空白部分可以放棋子,也有墙,问最多能放多少棋子使得棋子两两不会袭击? 棋子袭击当且仅当处在同一行或者同一列上并且中间没有墙的阻隔. 真是好久没写过搜索题了..这道题都写了这么久!! 直接写dfs(x,y,now) 代表我现在站在x点,y点上,那么就只能产生两种状态,放棋子或者不放棋子. 然后写一个C(x,y)代表当

Javascript之简单按钮搜索功能

<head> <title> new document </title> <meta name="generator" content="editplus" charset="utf-8"/> </head> <body> <form action="http://www.baidu.com/s" target="_blank"&

自定义超简单SearchView搜索框

先看效果图 Java代码: import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import an

js:ajax的get方法实现简单的搜索框提示

效果演示: 一,使用nodejs搭建后台环境,通过ajax的get方法将文本框中的值,实时传输到后台进行比较,后台返回相应的结果,将结果返回到ul中 1,创建路由 app4.js /** * Created by dyb on 2018/1/2. */ var express = require('express'); var fs= require('fs'); var url = require('url'); var app = express(); var mysql = require