Knightmare HDU - 6253

题目链接

我是个渣渣,啊好像我写一篇博客就要这么说一遍,最近真的是很颓废啊,自卑到了极点吧,有时候觉得自己可能不适合ACM吧,就很难过。这道题目的DFS打表我写了两个小时足以说明我自己有多么差劲。最后还是没发现自己哪里出了bug,问了xq,他说他现在还不如我emmm以后不去问他了吧,以后啊我要多多泡机房,学习才使我快乐。最后梁大佬救了我,指出来哪里错了,他只用了五分钟就看出来我错到哪了,我都要感动哭了。

这是我的错误打表

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn = 1000;
ll ans;
int n,vis[maxn][maxn];
int dx[] = {1, 1,2, 2,-1,-1,-2,-2};
int dy[] = {2,-2,1,-1, 2,-2, 1,-1};
void dfs(int x,int y,int deep)
{
    if(deep == n) return;
    for(int i=0; i<8; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(vis[nx][ny]) continue;
        vis[nx][ny] = 1;
        ans++;
        dfs(nx,ny,deep + 1);
    }
}
int main()
{
    while(scanf("%d",&n) && n)
    {
        ans = 1;
        memset(vis,0,sizeof(vis));
        vis[500][500] = 1;
        dfs(500,500,0);
        printf("%I64d\n",ans);
    }
    return 0;
}

这是改过以后的
 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn = 1000;
ll ans;
int n,vis[maxn][maxn];
int dx[] = {1, 1,2, 2,-1,-1,-2,-2};
int dy[] = {2,-2,1,-1, 2,-2, 1,-1};
void dfs(int x,int y,int deep)
{
    if(deep == n) return;
    for(int i=0; i<8; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        //if(vis[nx][ny]) continue;
        if(!vis[nx][ny]) ans++;
        vis[nx][ny] = 1;
        dfs(nx,ny,deep + 1);
    }
}
int main()
{
    while(scanf("%d",&n) && n)
    {
        ans = 1;
        memset(vis,0,sizeof(vis));
        vis[500][500] = 1;
        dfs(500,500,0);
        printf("%I64d\n",ans);
    }
    return 0;
}

因为dfs深度搜索

举个例子吧,假如dfs在第3步访问到了某个点,但这个点可能第2步就能访问到,以后就不会再更新它了。梁大佬原话。

在场上时emmm我们后面那个队伍声音比较大,偷听到了他们算出来的前7个数,我发现了一个规律,但是我最近很自卑啊,我根本都不相信我自己个渣渣能找到规律,emmm还是后面那个队他们推出公式以后说出来了,我选择默默记下,但是没交,他们交了两遍WA了,我们后来交的,一遍过了。

这里我想说下我自己找的规律虽然我很渣渣,就是从第6个数开始,第i个数与第i-1个数的差的差是28.然后emmm让我来推下公式14 *  n * n - 6 * n + 5,但是直接写会爆,所以换种写法205 + (n - 4) * (14 * n + 50)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;

int main()
{
    int t;
    scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
        ll n;
        llu ans;
        scanf("%I64d",&n);
        if(n == 0) ans  = 1;
        else if(n == 1) ans = 9;
        else if(n == 2) ans = 41;
        else if(n == 3) ans = 109;
        else if(n == 4) ans = 205;
        else if(n == 5) ans = 325;
        else ans = 205 + (n - 4) * (14 * n + 50);
        printf("Case #%d: %llu\n",k,ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值