您的位置:首页 > 其它

HDU 1978 How many ways

2015-08-10 10:50 363 查看
题目地址:点击打开链接

思路:看清题,机器人只能向下或向右走,和杭电1028挺像,把代码随便改了下,结果老是运行出错,把代码嵌到别人的代码试试才发现死循环了,每次走的步数是向下和和向右的和

错误代码:

#include <iostream>
#include<cstring>

using namespace std;

int map1[105][105];
int dp[105][105];
int n,m;

int dfs(int x,int y)
{
int newx,newy,i,j;
if(dp[x][y] || !map1[x][y])
return dp[x][y];
for(i=0; i<=map1[x][y]; i++)
{
for(j=0; j<=map1[x][y]-i; j++)
{
newx = x + i;
newy = y + j;
if(newx>=0 && newy>=0 && newx<n && newy<m)//i和j同时为0就陷入死循环了
dp[x][y] = (dp[x][y] + dfs(newx,newy)) % 10000;
}
}
return dp[x][y];
}

int main()
{
int i,j,t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>map1[i][j];
}
}
dp[n-1][m-1] = 1;
cout<<dfs(0,0)<<endl;

}
return 0;
}



AC代码:

dp[x][y]记录的是点(x,y)到点(n-1,m-1)的数量,dp[x][y]的数量可以由它所到达的点的dp[x][y]的和求出来

#include <iostream>
#include<cstring>

using namespace std;

int map1[105][105];
int dp[105][105];
int n,m;

int dfs(int x,int y)
{
int newx,newy,i,j;
if(dp[x][y] || !map1[x][y])//map[i][j]为0时肯定没有到点(n-1,m-1)的路,返回dp[x][y],此时dp[x][y]为0
return dp[x][y];
for(i=0; i<=map1[x][y]; i++)
{
for(j=0; j<=map1[x][y]-i; j++)
{
newx = x + i;
newy = y + j;
if(newx>=0 && newy>=0 && newx<n && newy<m && i+j!=0)
dp[x][y] = (dp[x][y] + dfs(newx,newy)) % 10000;
}
}
return dp[x][y];
}

int main()
{
int i,j,t;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>map1[i][j];
}
}
dp[n-1][m-1] = 1;
cout<<dfs(0,0)<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: