题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2003
代码:
深搜超时。
#include<stdio.h>
#include<string.h>
using namespace std;
int book[40][40];
int ans;
int dx[4]= {1,0,-1,0};
int dy[4]= {0,-1,0,1};
int t;
void dfs(int x,int y)
{
if(x==t&&y==t)
{
//printf("***");
ans++;
return;
}
for(int i=0; i<4; i++)
{
int fx=x+dx[i];
int fy=y+dy[i];
if(fx>0&&fx<=t&&fy>0&&fy<=t&&book[fx][fy]==0&&fx>=x&&fy>=y)
{
//printf("%d %d\n",fx,fy);
book[fx][fy]=1;
dfs(fx,fy);
book[fx][fy]=0;
}
}
//return;
}
int main()
{
while(~scanf("%d",&t))
{
ans=0;
//book[1][1]=1;
for(int i=1;i<t;i++)
book[i][i]=1;
dfs(1,1);
printf("%d\n",ans);
}
}
动态规划。
#include<stdio.h>
#include<string.h>
long long int dp[1000][1000];
int main()
{
short int n;
memset(dp,0,sizeof(dp));
while(~scanf("%lld",&n))
{
int i,j;
for(i=1;i<=n;i++)
{
dp[i][1]=1;
}
for(i=3;i<=n;i++)
{
for(j=2;j<i;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];//每一步都由其上一步来决定
}
}
printf("%lld\n",dp[n][n-1]*2);//因算不到最后一步,所以由其上一步来确定
}
return 0;
}