HDOJ-1312 Red and Black

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312

 

 1 //DFS
 2 #include<iostream>
 3 int count,m,n;
 4 int dir[4][2]={-1,0,1,0,0,-1,0,1};
 5 char map[21][21];
 6 void DFS(int i,int j)
 7 {
 8     if(i<=0||i>m||j<=0||j>n)
 9         return;
10     for(int k=0;k<4;++k)
11         if(i+dir[k][0]>0&&i+dir[k][0]<=m&&j+dir[k][1]>0&&j+dir[k][1]<=n)
12             if(map[i+dir[k][0]][j+dir[k][1]]=='.')
13             {
14                 ++count;
15                 map[i+dir[k][0]][j+dir[k][1]]='#';
16                 DFS(i+dir[k][0],j+dir[k][1]);
17             }
18 }
19 int main()
20 {
21     using namespace std;
22     int i,j,stx,sty;
23     while(cin>>n>>m&&(n||m))
24     {
25         count=1;
26         for(i=1;i<=m;++i)
27             for(j=1;j<=n;++j)
28             {
29                 cin>>map[i][j];
30                 if(map[i][j]=='@')
31                 {
32                     stx=i;
33                     sty=j;
34                     map[i][j]='#';
35                 }
36             }
37         DFS(stx,sty);
38         cout<<count<<endl;
39     }
40     return 0;
41 }

 

 

 1 #include <iostream> 
 2 using namespace std;
 3 //宏定义增强代码适应能力和可读性
 4 #define MAX 22 
 5 char rect[MAX][MAX]; 
 6 
 7 int walkFrom(int currentRow, int currentCol); //返回从某点走过的格子数,减少全局量的使用
 8 void main()
 9 {
10     int col, row;
11     while(cin >> col >> row, col!=0 && row != 0)
12     { 
13         int i, j, startRow, startCol;
14         for(i = 0; i < MAX; i++)//intialize--方块四周加白色块,去掉边界判断,
15             for(j=0; j<MAX; j++)
16                 rect[i][j]='#'; 
17         for(i=1;i<=row;i++)
18             for(j=1;j<=col;j++)
19             {
20                 cin >> rect[i][j];
21                 if(rect[i][j] == '@')
22                 {
23                     startRow = i;
24                     startCol = j; 
25                     rect[i][j]='.';
26                 }
27             }
28         cout << walkFrom(startRow,startCol) << endl;
29     }
30 } 
31 int walkFrom(int currentRow, int currentCol)
32 { 
33       if(rect[currentRow][currentCol] == '#')
34               return 0; 
35       else
36           rect[currentRow][currentCol] = '#'; 
37       return  
38          1+walkFrom(currentRow+1,currentCol)+walkFrom(currentRow-1,currentCol)
39          +walkFrom(currentRow,currentCol+1)+walkFrom(currentRow,currentCol-1); 
40 } 

 

 

转载于:https://www.cnblogs.com/dongsheng/archive/2012/06/21/2558038.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>