POJ 2329 (暴力+搜索bfs)

Nearest number - 2

Time Limit: 5000MS Memory Limit: 65536K
Total Submissions: 3943 Accepted: 1210

Description

Input is the matrix A of N by N non-negative integers.

A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|.

Your program must replace each zero element in the matrix with the nearest non-zero one. If there are two or more nearest non-zeroes, the zero must be left in place.

Constraints

1 ≤ N ≤ 200, 0 ≤ Ai ≤ 1000000

Input

Input contains the number N followed by N2 integers, representing the matrix row-by-row.

Output

Output must contain N2 integers, representing the modified matrix row-by-row.

Sample Input

3
0 0 0
1 0 2
0 3 0

Sample Output

1 0 2
1 0 2
0 3 0

#include<iostream>
#include<cstdio>

using namespace std;

int n;
int matri[210][210];
int dx[]={1,1,-1,-1},cx[]={-1,0,1,0};
int dy[]={-1,1,1,-1},cy[]={0,-1,0,1};

bool in_matrix(int x,int y)
{
    if(x<0||x>=n) return false;
    if(y<0||y>=n) return false;
    return true;
}

int bfs(int x,int y,int k)
{
    if(k>n) return 0;                           //n*n matrix搜索K次,自己可以特值来理解
    if(matri[x][y]||n==1) return matri[x][y];   //数不为0,或只有一个数(即 1*1 矩阵),就输出
    int xx,yy,X,Y;
    int i,j;
    int cnt=0,die=0;
    for(i=0;i<4;i++)           //对于菱形4条边的搜索,这里是以每边K个数字来写。
    {
        xx=x+k*cx[i];
        yy=y+k*cy[i];
        for(j=k;j--;)              //相当于for(j=0;j<k;j++),一边k个数,所以搜索k次
        {
            if(in_matrix(xx,yy)&&matri[xx][yy])
            {
                if(cnt==1)
                {
                    die=1;
                    break;
                }

                X=xx;
                Y=yy;
                cnt++;

            }
            xx+=dx[i];
            yy+=dy[i];
        }
        if(die)
            break;
    }
    if(cnt==0)
        return bfs(x,y,k+1);
    else if(die)
        return 0;
    else
        return matri[X][Y];

}

int main()
{
    scanf("%d",&n);
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
            scanf("%d",&matri[i][j]);

    for(int i = 0; i < n; ++i,printf("\n"))
        for(int j = 0; j < n; ++j)
            printf("%d ",bfs(i,j,1));

    return 0;
}

(借鉴大大的思路)

值得学习的是,对于矩阵的逆时针菱形搜索,思考了很长时间都没有想清楚。

自己可以试一下顺时针,一样的道理哦。

int dx[]={1,1,-1,-1},cx[]={-1,0,1,0};

int dy[]={-1,1,1,-1},cy[]={0,-1,0,1};

主要是这两对数组,用的很是巧妙!



POJ 2329 (暴力+搜索bfs),布布扣,bubuko.com

时间: 2024-10-27 08:04:46

POJ 2329 (暴力+搜索bfs)的相关文章

POJ 2785 (暴力搜索&amp;二分)

The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .

POJ 1166 暴力搜索 即 枚举

e.... 米还是没有读懂题....T_T ..... e.... 这就是传说中的暴力吗....太血腥了....太暴力了...九重for循环....就这么赤裸裸的AC了.... 水是水了点..但是..我也没想到可以这样解..因为每种操作最多只能进行三次 不然就是重复了..所以...附代码: #include<stdio.h>#include<iostream>#include<string.h>#define FOR(x) for (x=0; x<=3; ++x)

[暴力搜索] POJ 3087 Shuffle&#39;m Up

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10003   Accepted: 4631 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks o

poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)

题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一个边界外,跳到了另一边的边界外,每跳一次对那个点进行标记. 现在给你很多青蛙跳过后的所标记的所有点,那请你从这些点里面找出 一条可能的路径里面出现过的标记点最多. 分析:先排序(目的是方便剪枝,break),然后枚举两个点,这两个 点代表这条路径的起始的两个点.然后是三个剪枝,下面有. 开始遍历时,

G - Shuffle&#39;m Up POJ 3087 模拟洗牌的过程,算作暴力搜索也不为过

G - Shuffle'm Up Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3087 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by start

POJ 2110 Mountain Walking 暴力搜索+二分

题意:n*n的矩阵 每次能走四个方向,定义路径的花费为:路径中方格的max-min,问从左上到右下的最小花费,n<=100 4个方向不是DAG,不能DP,暴力搜索 每个点最坏情况下走n*n 共n*n个点 O(n^4)TLE二分ans后 枚举下界,则此时知道路径的最小值和最大值从 起点出发把mn<=c<=mx的点都遍历,此时dfs 相当于遍历图,不用回溯,复杂度为O(n^3*logn) #include <iostream> #include <cstring> #

POJ 2329 -- Nearest number - 2

Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4224   Accepted: 1308 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your program must repla

HDU 4499 Cannon (暴力搜索)

题意:在n*m的方格里有t个棋子,问最多能放多少个炮且每个炮不能互相攻击(炮吃炮) 炮吃炮:在同一行或同一列且中间有一颗棋子. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <math.h> #define M 50 #define LL long long using

poj 3026 Borg Maze (bfs + 最小生成树)

链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走),空格代表空位(可走),S代表搜索起点(可走) A代表外星人站(可走),现在要从S出发,将S和所有的A之间都连通,求路线总距离最小值 分析:可以先用bfs将所有的A,S两两之间的最短距离,题目的目的是将S与所有的A连通,使得总距离最小, 所有任选一点开始按最小生成树的算法做就行,并非非要从S点开始 注:题目输入x,y后可能有很多空格,可以用gets将多余的空格取走,开数组是尽量开大点,之前虽然开的比题目数据     稍大,但一