我是个渣渣,啊好像我写一篇博客就要这么说一遍,最近真的是很颓废啊,自卑到了极点吧,有时候觉得自己可能不适合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;
}