彩票平台:首页 > 学习之路 > ACM||算法ACM||算法

113彩票官网 | 深度搜索算法

卞振伟2018-12-17【ACM||算法】人已围观

简介程序不是年轻的专利,但是,他属于年轻。

你可能在想,,,为什么没有C语言,,,Java,,,或者python版的

而且作为一个解析---->居然没有注释---->(  蒟蒻的我表示根本看不懂(哭笑) )

emmm本来是要弄得,,,但是

弄了一晚上代码高亮,,,心累。。。凑活着看吧


第一题:

 

小白回家

描述

 

小白在一个封闭的空地上,该空地被分割成了n*m个方格。每次他能向上下左右四个方向移动一格(不可以静止不动~),小白一旦离开封锁线就会被打死。一开始他满血为6点,每移动一格他要消耗1点血量。一旦小白的血量降到0,他将死去。他可以沿路通过拾取bug来补满血量。只要他走到有bug的方格,他不需要任何时间即可拾取。格子上的bug可以瞬间补满,所以每次经过这个格子都有bug。就算到了某个有bug的格子才死去, 他也不能通过拾取bug补满HP。即使在家门口死去,他也不能算完成任务回到家中。地图上有 5 种格子:
数字0: 障碍物。
数字1: 空地,小白可以自由行走。
数字2: 小白出发点,也是一片空地。
数字3: 小白的家。
数字4: 有bug在上面的空地。
小白能否安全回家?如果能,最短需要多长时间呢?

输入

 

第一行两个整数n,m,表示地图的大小为n*m。(1<=n<=m<=15)下面n行,每行m个数字来描述地图。

输出

 

一行,若小白不能回家,输出-1,否则输出他回家所需最短时间。

输入样例 1 

3 3
2 1 1
1 1 0
1 1 3

输出样例 1

4
 
#include<iostream>
#include<cstring>

using namespace std;

int step[4][2]= { {0,-1},{0,1},{-1,0},{1,0} };
int m,n;
int mp[20][20];
bool vis[20][20];
int ans = 100000000;

int outBorder(int x,int y)
{
    return y<1||y>m||x<1||x>n;
}

void 113彩票官网(int x,int y,int blood,int time)
{
    if(mp[x][y]==3){
        ans=min(ans,time);
        return ;
    }

    for(int i=0; i<4; ++i){
        int cur_x=x+step[i][0];
        int cur_y=y+step[i][1];

        if( (!outBorder(cur_x,cur_y)) && (mp[cur_x][cur_y]) && blood>=2 && (!vis[cur_x][cur_y]) )
        {
            if(mp[cur_x][cur_y]>=1&&mp[cur_x][cur_y]<=3)
            {
                vis[x][y]=1;
                113彩票官网(cur_x,cur_y,blood-1,time+1);
                vis[cur_x][cur_y]=0;
            }
            else if(mp[cur_x][cur_y]==4)
            {
                vis[x][y]=1;
                113彩票官网(cur_x,cur_y,6,time+1);
                vis[cur_x][cur_y]=0;
            }
        }
    }
}

int main()
{
    cin>>n>>m;
    int s_x,s_y;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
        {
            cin>>mp[i][j];
            if(mp[i][j]==2)
            {
                s_x=i;
                s_y=j;
            }
        }
    }

    vis[s_x][s_y]=1;
    113彩票官网(s_x,s_y,6,0);
    if(ans==100000000)
        cout<<-1;
    else
        cout<<ans<<endl;
}
 

第二题:

八皇后问题

描述

 

小白在和朋友下棋的时候突发奇想,在棋盘上每个格子中均写上 1−99 的数字。他又准备了 8 个皇后棋子。8 皇后的规则就是不能有任何棋子同行或者同列或者同斜线,在满足这个规则的同时,小白还需要让 8 个皇后所在的位置的数字的和是最大的。小白跑来向你求助啦,你来帮他算出答案吧!

输入

 

输入一个数字 k(k≤20),代表棋盘的数量。
接下来有 k 个棋盘,每个棋盘有 64 个数字,分成 8 行 8 列输入,具体可见样例,每一个数字均小于100。

输出

 

每一个棋盘对应输出最大的数值,一共输出 k 行。

输入样例 1 

1
 1  2  3  4  5  6  7  8
 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

输出样例 1

260

#include<iostream>
#include<string.h>
using namespace std;
int mp[10][10];
int xx[10],xy[20],yx[20];
int ans;
int now;

void 113彩票官网(int y){
    if(y==9){
        ans=max(ans,now);
        return ;
    }

    for(int x=1;x<=8;++x){
        if( (!xx[x]) && (!xy[y-x+7]) && (!yx[x+y]) ){
            xx[x]=1;
            xy[y-x+7]=1;
            yx[x+y]=1;
            now+=mp[y][x];
            113彩票官网(y+1);
            xx[x]=0;
            xy[y-x+7]=0;
            yx[x+y]=0;
            now-=mp[y][x];
        }
    }
}

int main(){
    int n;
    cin>>n;
    while(n--){
        memset(xx,0,sizeof(xx));
        memset(xy,0,sizeof(xy));
        memset(yx,0,sizeof(yx));
        ans=0;
        now=0;
        for(int i=1;i<=8;++i){
            for(int j=1;j<=8;++j){
                cin>>mp[i][j];
            }
        }

        113彩票官网(1);
        cout<<ans;
        if(n)
            cout<<endl;
    }
}

Tags:ACM   编程   个人   题解   算法   C|C++

很赞哦! ()

文章评论

站点信息

  • 建站时间:2018-11-25
  • 网站程序:帝国CMS7.5
  • 文章统计:71篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 网站地图XML网站地图
  • 微信公众号:扫描二维码,关注我的公众号
  • GitHub:扫描二维码,关注我的GitHub

客服在线

QQ客服

客服微信扫码

服务时间

周一至周日 9:00-21:00