2011年11月30日星期三

百练 2816 红与黑 递归水题


这题貌似搞了好一阵子。。。囧~明明是很简单的题目好不好。。。。
代码能力还是太差。。。好像还做复杂了点 = =!!
或者不需要另外开一个int数组。。。不过算了 = =
本来认为应该是DP的。。。其实感觉DP的思想也是可以的吧。。。
开始的时候没有考虑到四个角的情况,走到边上就return了 = =
后来发现不行,就增大了数组,每条边外面都加一行吧。。。
越看越觉得傻X了。。。囧~





#include“cstdio”
int num[25][25];
char table[25][25];
int x,y;
void get(int a,int b)
{
num[a][b] = 1;    //标记
if(a < 1 || b < 1 || a > y || b > x)return;
if(table[a-1][b] == '.' && num[a-1][b] != 1)get(a - 1,b);
if(table[a+1][b] == '.' && num[a+1][b] != 1)get(a + 1,b);
if(table[a][b-1] == '.' && num[a][b-1] != 1)get(a,b - 1);
if(table[a][b+1] == '.' && num[a][b+1] != 1)get(a,b + 1);
}
int main()
{
int t1,t2,t = 0;
while(scanf("%d%d",&x,&y) && x){
for(int i = 1;i <= y;i ++)
scanf("%s",&table[i][1]);    //输入数据,从[1]开始。。。
for(int i = 1;i <= y;i ++)
for(int j = 1;j <= x;j ++){
num[i][j] = 0;
if(table[i][j] == '@'){t1 = i;t2 = j;}    //清零顺便记录起始位置
}
get(t1,t2);
for(int i = 1;i <= y;i ++)
for(int j = 1;j <= x;j ++)
if(num[i][j])t++;
printf("%d\n",t);
t = 0;
}
return 0;
}


标程就是标程 = =!!
/*
int f(int x, int y){
if(x < 0 || x >= W || y < 0 || y >= H)return 0; // 如果走出矩阵范围
if(z[x][y] == '#')return 0;
else{
z[x][y] = '#'; // 将走过的瓷砖做标记
return 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1);
}
}
*/


没有评论:

发表评论