TZOJ 1646: Hopscotch 深搜+set去重

描述

奶牛以非传统的方式玩孩子的跳房子游戏。奶牛不是要跳入一组线性编号的框,而是创建一个平行于 x 和 y 轴的 5x5 直线数字网格。

然后他们熟练地跳到网格中的任何数字上,并向前、向后、向右或向左(从不斜向)跳到网格中的另一个数字。他们再次(相同的规则)跳到一个数字(可能是一个已经访问过的数字)。

共有五个网格内跃点,它们的跃点创建一个六位数的整数(可能有前导零,如 000201)。

确定可以以这种方式创建的不同整数的数量。

输入

* 第 1..5 行:网格,每行五个整数

输出

* 第 1 行:可以构造的不同整数的数量

样例输入

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1

样例输出

 15

提示

输出详细信息:
111111、111112、111121、111211、111212、112111、112121、121111、121112、121211、121212、211111、211121、2112111 和 22112 可以构建。没有其他值是可能的。

题目来源

USACO 2005 年 11 月

 

AC:扫一遍5*5的地图,对于每一个点都要去搜一遍,把每一个能跳的位置都添加到vector中,递归终止条件为vector项目==6时,把vector插入到set中去,靠着set的去重效果,在整个地图深搜遍历结束后,直接输出set的size()即可

#include<iostream>
#include<math.h>
#include<set>
#include<vector>
using namespace std;
int a[6][6];
set<vector<int> > ss;
int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x,int y,vector<int> v)
{
    if(v.size()==6){
        ss.insert(v);return ;
    }
    v.push_back(a[x][y]);
    for(int i=0;i<4;i++)
    {
        int tx = x+nex[i][0];
        int ty = y+nex[i][1];
        if(tx<1||tx>5||ty<1||ty>5)continue;
        dfs(tx,ty,v);
    }
    v.pop_back();
    return ;
}
int main()
{
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=5;j++)cin>>a[i][j];
    }
    for(int i=1;i<=5;i++){
        for(int j=1;j<=5;j++){
            vector<int> v;
            dfs(i,j,v);
        }
    }
    cout<<ss.size();
    return 0;
}

 

posted @ 2022-08-23 18:06  CRt0729  阅读(72)  评论(0编辑  收藏  举报