記憶化搜尋,反著搜比正著搜慢了不少,一個172MS,一個16MS
代碼:
/*#include<iostream><br />using namespace std;<br />__int64 map[40][40],f[40][40];<br />int n;<br />__int64 dfs(int i,int j)<br />{<br />if(f[i][j])<br />return f[i][j];<br />if(i<1||i>n||j<1||j>n||map[i][j]==0)<br />return 0;<br />__int64 num=0;<br />num+=dfs(i+map[i][j],j);<br />num+=dfs(i,j+map[i][j]);<br />f[i][j]=num;<br />return f[i][j];<br />}<br />int main()<br />{<br />int i,j;<br />__int64 ans;<br />char c;<br />while(scanf("%d",&n)!=EOF&&n>0)<br />{<br />memset(f,0,sizeof(f));<br />getchar();<br />for(i=1;i<=n;i++)<br />{<br />for(j=1;j<=n;j++)<br />{<br />scanf("%c",&c);<br />map[i][j]=c-'0';<br />}<br />getchar();<br />}<br />//cout<<"yes"<<endl;<br />f[n][n]=1;<br />ans=dfs(1,1);<br />printf("%I64d/n",ans);<br />}<br />return 0;<br />}*/<br />#include<iostream><br />using namespace std;<br />__int64 map[40][40],f[40][40];<br />int n;<br />__int64 dfs(int i,int j)<br />{<br />if(f[i][j])<br />return f[i][j];<br />int x,y;<br />__int64 num=0;<br />for(x=i-1;x>=1;x--)<br />{<br />if(x+map[x][j]==i)<br />num+=dfs(x,j);<br />}<br />for(y=j-1;y>=1;y--)<br />{<br />if(y+map[i][y]==j)<br />num+=dfs(i,y);<br />}<br />f[i][j]=num;<br />return f[i][j];<br />}<br />int main()<br />{<br />int i,j;<br />__int64 ans;<br />char c;<br />while(scanf("%d",&n)!=EOF&&n>0)<br />{<br />memset(f,0,sizeof(f));<br />getchar();<br />for(i=1;i<=n;i++)<br />{<br />for(j=1;j<=n;j++)<br />{<br />scanf("%c",&c);<br />map[i][j]=c-'0';<br />}<br />getchar();<br />}<br />//cout<<"yes"<<endl;<br />f[1][1]=1;<br />ans=dfs(n,n);<br />printf("%I64d/n",ans);<br />}<br />return 0;<br />}