hdu 5254

简单搜索 广搜 深搜 随便搜 开始想用vis  标记是否访问过  然后发现访问过的仍需访问 并不能用vis 标记 于是就想了另外一种方法 用三个方向    


    每次去访问四个对角  只有当 邻接对角 内元素为1  且   相邻两个方格内元素至少有一个为0  才去访问这个点 这样就保证了不会重复访问无用的点


hdu 5254_第1张图片


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long ll;
typedef long double ld;

const int N = 510;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);

#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)

int dir1[4][2] = {1, 1, 1, -1, -1, 1, -1, -1};
int dir2[4][2] = {0, 1, 0, -1, 0, 1, 0, -1};
int dir3[4][2] = {1, 0, 1, 0, -1, 0, -1, 0};

int g[N][N], m, n, sum;

void bfs ();

struct node
{
    int x, y;
};

queue  que;

int main ()
{
    int t, ca = 1;
    scanf ("%d", &t);
    while (t--)
    {
        node te;
        int s, x, y;
        met (g, 0);
        sum = 0;
        scanf ("%d%d%d", &m, &n, &s);
        for (int i=0; i 0 && q.x <= m && q.y > 0 && q.y <= n && g[q.x][q.y] &&(!g[q1.x][q.y] || !g[q2.x][q2.y]))
            {
                if (!g[q1.x][q1.y]) {g[q1.x][q1.y] = 1; que.push(q1); sum++;}
                if (!g[q2.x][q2.y]) {g[q2.x][q2.y] = 1; que.push(q2); sum++;}
            }
        }
    }
}



你可能感兴趣的:(hdu 5254)