棋盘

题目链接


 

 

暴搜法

首先声明:本人蒟蒻,题解的bug一片一片,敬请见谅。

废话不多说,开始思路。显而易见的,此题可以深搜。不知当时脑子有什么问题,立刻蹦出一个伟大错炸的想法:根据小奥最短路径,只能向下或向右走,不可向上或向左走,这会导致金钱增多。

于是就自然想到搜索下、下下、右、右右及右下。考虑m=1时,不需金币,输出0。

见代码。

#include <iostream>
#include<cmath>
using namespace std;
int m,n,x,y,z,num=0,max1=99999;
bool flag=true,s=true;
int a[1001][1001];
int search(int,int);
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y>>z;
        a[x][y]=(z+1);
    }
    if(m!=1)
    search(1,1);
    else
    {
        cout<<0;
        return 0;
    }
    if(max1!=99999)
    cout<<max1;
    else
    cout<<-1;
    return 0;
}
int search(int h,int l)
{
    if(h==m&&l==m)
    {
        if(max1>num)
        max1=num;
    }
    if(a[h][l+1]!=0)
    {
        num+=abs(a[h][l+1]-a[h][l]);
        flag=true;
        search(h,l+1);
        num-=abs(a[h][l+1]-a[h][l]);
        flag=false;
    }
    if(a[h+1][l]!=0)
    {
        num+=abs(a[h+1][l]-a[h][l]);
        flag=true;
        search(h+1,l);
        num-=abs(a[h+1][l]-a[h][l]);
        if(s==false)
        flag=false;
    }
    if(a[h][l+2]!=0&&flag==true)
    {
        flag=false;
        num+=2+abs(a[h][l+2]-a[h][l]);
        s=false;
        search(h,l+2);
        flag=true;
        s=true;
        num-=2+abs(a[h][l+2]-a[h][l]);
    }
    if(a[h+2][l]!=0&&flag==true)
    {
        flag=false;
        s=false;
        num+=2+abs(a[h+2][l]-a[h][l]);
        search(h+2,l);
        flag=true;
        s=true;
        num-=2+abs(a[h+2][l]-a[h][l]);
    }
        if(a[h+1][l+1]!=0&&flag==true)
    {
        flag=false;
        s=false;
        num+=2+abs(a[h+1][l+1]-a[h][l]);
        search(h+1,l+1);
        flag=true;
        s=true;
        num-=2+abs(a[h+1][l+1]-a[h][l]);
    }
}

  

可惜只拿到10分……

好歹样例过了!开心。


暴搜法2

然后在正常大脑的思考下,得到了正确的想法:如果说……只有一条路的话呢?弯弯绕绕扭七扭八,还不是要走?

于是新的思路出现了,搜索总共12个方向。

代码总体与上面差不多,就不放了。可是……分数又低了。5分!

当然这是正常的,12个方向,不死才有鬼呢!上面是全体WA,这是全体MLE。


 

暴搜法3

后来,惊奇地发现,只搜四个方向即可,设布尔变量储蓄魔法,有颜色就走,没颜色就用魔法,用过后就搜下一个。

题解如下:#include <iostream>

#include<cmath>
using namespace std;
int m,n,x,y,z,num=0,max1=99999;
bool flag=true,;
int b[5]={0,0,0,-1,1};
int c[5]={0,-1,1,0,0};
int a[1001][1001];
int search(int,int);
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y>>z;
        a[x][y]=(z+1);
    }
    if(m!=1)
    search(1,1);
    else
    {
    cout<<0;
    return 0;
}
    if(max1!=99999)
    cout<<max1;
    else
    cout<<-1;
    return 0;
}
int search(int h,int l)
{
    if(h==m&&l==m)
    {
if(num<max1) max1=num; } else { for(int i=1;i<=4;i++) { if(h+c[i]!=0&&l+b[i]!=0&&h+c[i]<m+1&&l+b[i]<m+1) { if(a[h+c[i]][l+b[i]]==0) { if(flag==true) { flag=false; num+=2; search(h+c[i],l+b[i]); flag=true; num-=2; } } else { flag=true; if(a[h][l]!=0) num+=abs(a[h+c[i]][l+b[i]]-a[h][l]); search(h+c[i],l+b[i]); if(a[h][l]!=0) num-=abs(a[h+c[i]][l+b[i]]-a[h][l]); if(a[h][l]==0) flag=false; } } } } }

  

可惜,这是个错代码,不管就这样吧。

望诸君见谅。

转载于:https://www.cnblogs.com/qing1/p/11012104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值