1. 程式人生 > >圖1(八連塊)

圖1(八連塊)

cte return i++ lse input [] lec 統計字符 ()

輸入一個m行n列的字符矩陣,統計字符“@”組成多少個八連塊。如果兩個字符“@”所在的格子相鄰(橫、豎或者對角線方向),就說它們屬於同一個八連塊。

Sample Input

1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0

Sample Output

0
1
2
2

#include"iostream"
using namespace std;
char **map;    
int w,h;
bool selected(int &y,int &x,int n){
    
int i[8] = {-1,0,1,1,1,0,-1,-1}; int j[8] = {-1,-1,-1,0,1,1,1,0}; if(i[n] + y >= 0 && i[n] + y < h && j[n] + x >= 0 && j[n] + x < w && map[i[n] + y][j[n] + x] == @){ y += i[n]; x += j[n]; return true; } return false; } void
find8(int y,int x){ if(map[y][x] == @){ map[y][x] = *; int x1 = x,y1 = y; for(int i = 0;i < 8;i++){ if(selected(y,x,i)){ find8(y,x); } x = x1; y = y1; } } } void create(){ map = new char
*[h]; for(int i = 0;i < h;i++){ map[i] = new char[w]; for(int j = 0;j < w;j++){ cin>>map[i][j]; } } } int main(){ while(cin>>w>>h && w && h){ int a = 2,b = 2; int count = 0; create(); for(int i = 0;i < h;i++){ for(int j = 0;j < w;j++){ if(map[i][j] == @){ find8(i,j); count++; } } } cout<<count<<endl; for(i = 0;i < h;i++){ delete[] map[i]; } } return 0; }

圖1(八連塊)