刚考完苦逼的近代史啊!!!伤不起啊,论文作业都没交不知道会不会挂唉。。。不要挂不要挂。。。(@﹏@)~
为了复习近代史有几天没ac了。。。先来道搜索dp热热身
#include<iostream>
using namespace std;
const int way[2][2]={{1,0},{0,1}};
__int64 dp[40][40];
int n;
char s[40][40];
int a[40][40];
void init()
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=-1;
}
}
return ;
}
bool can(int x,int y)
{
if(1<=x && x<=n && y>=1 && y <= n )
{
if( a[x][y] > 0)
{
return true;
}
else
{
if(x==y && x==n)
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
}
__int64 dfs(int x,int y)
{
if(x==y && x==n)
{
return 1;
}
else if(a[x][y]==0)
{
return 0;
}
else
{
if(dp[x][y]==-1)
{
int tx,ty;
__int64 temp=0;
for(int i=0;i<2;i++)
{
tx=x+way[i][0]*a[x][y];
ty=y+way[i][1]*a[x][y];
if(can(tx,ty))
{
temp+=dfs(tx,ty);
}
}
dp[x][y]=temp;
}
return dp[x][y];
}
}
int main()
{
while(cin>>n)
{
if(n==-1)
{
break;
}
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>s[i][j];
a[i][j]=s[i][j]-'0';
}
}
cout<<dfs(1,1)<<endl;
}
return 0;
}