POJ 1979 POJ 3009 AOJ 0033 AOJ 0118 [搜索类题目][0033贪心模拟]

Posted 可达龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1979 POJ 3009 AOJ 0033 AOJ 0118 [搜索类题目][0033贪心模拟]相关的知识,希望对你有一定的参考价值。

/**
POJ 1979

BFS
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
const int N = 20 + 5;

int mp[N][N];
int sx,sy;
int n, m;
int vis[3000];
int dirx[] = {0, 1, 0, -1};
int diry[] = {1, 0, -1, 0};
void solve()
{
    queue<int> Q;
    int cnt = 1;
    memset(vis, 0 , sizeof(vis));
    while(Q.size()) Q.pop();
    Q.push(sx*100 + sy);
    vis[sx*100 + sy] = 1;
    while(!Q.empty())
    {
        int tmp = Q.front(); Q.pop();
        int x = tmp / 100, y = tmp % 100;
        for(int i = 0; i < 4; i++)
        {
            int nx = x + dirx[i], ny = y + diry[i];
            if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx*100 + ny] || mp[nx][ny] == 0) continue;
            vis[nx*100+ny] = 1;
            cnt++;
            Q.push(nx*100 + ny);
        }
    }
    printf("%d\n", cnt);
}

int main()
{
    while(scanf("%d%d", &n, &m), n || m)
    {
        getchar();
        char ch;
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                scanf("%c", &ch);
                if(ch == .)
                    mp[i][j] = 1;
                else if(ch == #)
                    mp[i][j] = 0;
                else if(ch == @)
                {
                    sx = i, sy = j;
                    mp[i][j] = 1;
                }
            }
            getchar();
        }
        solve();
    }
    return 0;
}

 

/**
POJ 3009

DFS
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N = 20 + 5;
const int INF = 0x3f3f3f3f;
int n, m;
int mp[N][N];
int dirx[] = {0, -1, 0, 1};
int diry[] = {1, 0, -1, 0};
int sx,sy,ex,ey;
int success;

int dfs(int x, int y, int cur, int step)
{
    if(cur >= 10)
        return 0;
    for(int i = 0; i < 4; i++)
    {
        int nx = x + dirx[i], ny = y + diry[i];
        if(nx < 0|| nx >= m || ny < 0 || ny >= n || mp[nx][ny] == 1) continue;
        if(nx == ex && ny == ey)
        {
            success = min(success, step + 1);
            return 1;
        }
        while(nx >= 0 && nx < m && ny >= 0 && ny < n
              && mp[nx][ny] == 0)
        {
            nx += dirx[i];
            ny += diry[i];
            if(nx == ex && ny == ey)
            {
                success = min(success, step + 1);
                return 1;
            }
        }
        if(nx < 0 || nx >=m || ny < 0 || ny >= n ) continue;
        if(mp[nx][ny] == 1)
        {
            mp[nx][ny] = 0;
            nx -= dirx[i];
            ny -= diry[i];
            dfs(nx, ny, cur+1, step+1);
            nx += dirx[i];
            ny += diry[i];
            mp[nx][ny] = 1;
        }
    }
    return 0;
}


int main()
{
    while(scanf("%d%d", &n, &m), n || m)
    {
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                scanf("%d", &mp[i][j]);
                if(mp[i][j] == 2)
                {
                    sx = i, sy = j;
                    mp[i][j] = 0;
                }
                else if(mp[i][j] == 3)
                {
                    ex = i, ey = j;
                    mp[i][j] = 0;
                }
            }
        }
        success = INF;
        dfs(sx,sy, 0, 0);

        if(success < INF)
            printf("%d\n", success);
        else
            printf("-1\n");
    }
    return 0;
}

 

/**
AOJ 0118

DFS
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N = 100 + 5;

int n,m;
int mp[N][N];
int dirx[] = {0, 1, 0, -1};
int diry[] = {1, 0, -1, 0};
int apple, pear, orange;

void dfs(int x, int y, int color)
{
    mp[x][y] = 0;
    for(int i = 0; i < 4; i++)
    {
        int nx = x + dirx[i], ny = y + diry[i];
        if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
        if(mp[nx][ny] == color)
            dfs(nx, ny, color);
    }
}


int main()
{
    while(scanf("%d%d", &n, &m), n || m)
    {
        apple = pear = orange = 0;
        char ch;
        getchar();
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                scanf("%c", &ch);
                if(ch == @) mp[i][j] = 1;
                else if(ch == #) mp[i][j] = 2;
                else if(ch == *) mp[i][j] = 3;
            }
            getchar();
        }

        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                if(mp[i][j] == 1)
                {
                    apple++;
                }
                else if(mp[i][j] == 2)
                {
                    pear++;
                }
                else if(mp[i][j] == 3)
                {
                    orange++;
                }
                else
                    continue;
                dfs(i, j, mp[i][j]);
            }
        }
        printf("%d\n", apple+pear+orange);
    }
    return 0;
}

 

/**
贪心模拟

先放左再放右,优先选择大的能放的放
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N = 20 + 5;

int T;

int main()
{
    scanf("%d", &T);
    while(T--)
    {
        int left = 0, right = 0, flag = 0;
        for(int i = 0; i < 10; i++)
        {
            int tmp;
            scanf("%d", &tmp);
            if(tmp > left) left =tmp;
            else if(tmp > right) right = tmp;
            else flag = 1;
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

 

以上是关于POJ 1979 POJ 3009 AOJ 0033 AOJ 0118 [搜索类题目][0033贪心模拟]的主要内容,如果未能解决你的问题,请参考以下文章

poj1979 解题报告

水题-poj1979

POJ1979 Red and Black

POJ 1979 Red and Black

POJ 1979 Red and Black(DFS)

POJ-1979