| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 742 人关注过本帖
标题:以下是我自己编的代码,但是找不出问题所在,大神求解
取消只看楼主 加入收藏
uuien22
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
以下是我自己编的代码,但是找不出问题所在,大神求解
题目:

Description
Once there was a king named Akbar. He had a son named Shahjahan. For an unforgivable reason the king wanted him to leave the kingdom. Since he loved his son he decided his son would be banished in a new place. The prince became sad, but he followed his father's will. In the way he found that the place was a combination of land and water. Since he didn't know how to swim, he was only able to move on the land. He didn't know how many places might be his destination. So, he asked your help.
For simplicity, you can consider the place as a rectangular grid consisting of some cells. A cell can be a land or can contain water. Each time the prince can move to a new cell from his current position if they share a side.
Now write a program to find the number of cells (unit land) he could reach including the cell he was living.


Input
Input starts with an integer T (≤ 500), denoting the number of test cases.
Each case starts with a line containing two positive integers W and H; W and H are the numbers of cells in the x and y directions, respectively. W and H are not more than 20.
There will be H more lines in the data set, each of which includes W characters. Each character represents the status of a cell as follows.
1) '.' - land
2) '#' - water
3) '@' - initial position of prince (appears exactly once in a dataset)

Output
For each case, print the case number and the number of cells he can reach from the initial position (including it).

Sample Input
4
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..

Sample Output
Case 1: 45
Case 2: 59
Case 3: 6
Case 4: 13

以下是我的代码:  
程序代码:
#include <iostream>
using namespace std;
int t=0,r,k;
int pr( char (*a)[20] ,int n,int m)
{
    if(a[n][m]=='@') {t++;return 0;}
    if(a[n][m+1]=='.' && m+1<=k)
        if(pr(a,n,m+1)==0) return 0;
    if(a[n][m-1]=='.' && m-1>=0)
        if(pr(a,n,m-1)==0) return 0;
    if(a[n-1][m]=='.' && n-1>=0)
        if(pr(a,n-1,m)==0) return 0;
    if(a[n+1][m]=='.' && n+1<=r)
        if(pr(a,n+1,m)==0) return 0;
    if(a[n][m+1]=='@' && m+1<=k) {t++;return 0;}
    if(a[n][m-1]=='@' && m-1>=0) {t++;return 0;}
    if(a[n-1][m]=='@' && n-1>=0) {t++;return 0;}
    if(a[n+1][m]=='@' && n+1<=r) {t++;return 0;}
    return 0;
}
int num(int a[],int i)
{
    if (i==0) return 0;
    return a[i-1]+num( a ,i-1);
}
int main ()
{
    int n,m,w[20]={0},i,T;
    char a[20][20];
    cin >> T;
    for( i=0;i<T;i++)
    {
        cin >> r >> k;
        for(n=0;n<k;n++)
            for(m=0;m<r;m++)
                cin >> a[n][m];
        for(n=0;n<k;n++)
            for(m=0;m<r;m++)
                pr(a,n,m);
        w[i]=t-num(w,i);
    }
    for (r=0;r<T;r++)
    {
        cout << w[r] << endl;
    }
    return 0;
}

搜索更多相关主题的帖子: his prince decided kingdom father 
2013-02-21 16:06
uuien22
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-21
收藏
得分:0 
我对题目的理解:
王子被国王流放,起点是以“@”标记的土地,他可以在以“.”标记的土地走动,而以“#”标记的不可以。
求王子可以走动的土地的总数(包括“@”)。
2013-02-21 16:20
uuien22
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-21
收藏
得分:0 
回复 3楼 fanpengpeng



 
以下是引用fanpengpeng在2013-2-22 11:18:17的发言:
你可以先描述你解决问题的大致思路,然后说一下你的代码出了哪些问题
这样别人会更容易去理解你的代码 也知道从哪里去找原因
    我是这样想的,输入所以的数据后,逐个坐标检查,如果是“.”的,就左右上下移动,遇到“#”停止,如果可以移到“@”标记的地方,计数的t加1。代码没有警告提示,但是运行的时候输入数据后会运行错误,电脑会要求关闭程序。
   
    (还有上面的代码,刚刚看了,这样把符合条件的位置计数后标记的办法更好,谢谢啦。)
2013-02-22 21:12
uuien22
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-2-21
收藏
得分:0 
回复 6楼 fanpengpeng


    当时我也有担心会无限循环,所以就尝试用返回的数字来判断是否应该结束函数。不过还是不行
程序代码:
int pr( char (*a)[20] ,int n,int m)

 {
     if(a[n][m]=='@') {t++;return 0;}
     if(a[n][m+1]=='.' && m+1<=k)
         if(pr(a,n,m+1)==0) return 0;
     if(a[n][m-1]=='.' && m-1>=0)
         if(pr(a,n,m-1)==0) return 0;
     if(a[n-1][m]=='.' && n-1>=0)
         if(pr(a,n-1,m)==0) return 0;
     if(a[n+1][m]=='.' && n+1<=r)
         if(pr(a,n+1,m)==0) return 0;
     if(a[n][m+1]=='@' && m+1<=k) {t++;return 0;}
     if(a[n][m-1]=='@' && m-1>=0) {t++;return 0;}
     if(a[n-1][m]=='@' && n-1>=0) {t++;return 0;}
     if(a[n+1][m]=='@' && n+1<=r) {t++;return 0;}
     return 1;

 }

 





 
2013-02-23 15:42
快速回复:以下是我自己编的代码,但是找不出问题所在,大神求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038969 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved