题意:给定一个网格,然后其中的 '.' 中可以建塔,有两种塔,绿塔可以装100人,红塔可以容纳200人不过必须要边上有绿塔(同边)的时候才能建造,对一个 '.'格子有三种操作,
建立绿塔,摧毁塔,建立红塔,让你给出一种方案使得容纳总人数最多
解题思路:先把每一个 ‘.’ 建立绿塔,可以把每 一块 独立的 '.' 单独出来bfs 然后从栈尾的点一直摧毁建立红塔一直到栈只剩一个元素,就这样就可以了!!
解题代码:
1 // File Name: d.c 2 // Author: darkdream 3 // Created Time: 2013年07月18日 星期四 20时43分56秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 #include<ctype.h> 11 char str[505][505]; 12 int step[1000005][4]; 13 int visit[505][505]; 14 struct node 15 { 16 int x,y; 17 }list[260000]; 18 int xdd[] = {0,0,1,-1}; 19 int ydd[] = {1,-1,0,0}; 20 int k = 0 ; 21 void doright(int i , int j ) 22 { 23 int up = 1; 24 int high = 1; 25 list[1].x = i ; 26 list[1].y = j; 27 visit[i][j] = 1; 28 while(up <= high) 29 { 30 for(int t = 0 ;t <= 3 ;t ++) 31 { 32 int ti = list[up].x + xdd[t]; 33 int tj = list[up].y + ydd[t]; 34 if(str[ti][tj] == '.' && visit[ti][tj] == 0 ) 35 { 36 visit[ti][tj] = 1; 37 high ++; 38 list[high].x = ti ; 39 list[high].y = tj ; 40 } 41 42 } 43 up++; 44 } 45 for(int t = high ;t > 1; t --) 46 { 47 str[list[t].x][list[t].y] = '#'; 48 k++; 49 step[k][1] = 2 ; 50 step[k][2] = list[t].x; 51 step[k][3] = list[t].y; 52 k++; 53 step[k][1] = 3 ; 54 step[k][2] = list[t].x; 55 step[k][3] = list[t].y; 56 } 57 58 } 59 60 int main(){ 61 memset(visit,0,sizeof(visit)); 62 //freopen("/home/plac/problem/input.txt","r",stdin); 63 //freopen("/home/plac/problem/output.txt","w",stdout); 64 int n ,m ; 65 scanf("%d %d",&n,&m); 66 for(int i = 1;i <= n;i ++) 67 { 68 scanf("%s",&str[i][1]); 69 } 70 71 for(int i= 1;i <= n;i ++) 72 for(int j = 1; j <= m;j ++) 73 { 74 if(str[i][j] == '.') 75 { 76 k++; 77 step[k][1] = 1; 78 step[k][2] = i; 79 step[k][3] = j; 80 81 } 82 } 83 for(int i = 1 ;i <= n;i ++) 84 for(int j= 1;j <= m;j ++) 85 { 86 if(str[i][j] == '.') 87 doright(i,j); 88 } 89 printf("%d ",k); 90 91 for(int i =1 ;i <= k ;i ++) 92 { 93 if(step[i][1] == 1) 94 printf("B "); 95 else if(step[i][1] == 2) 96 printf("D "); 97 else printf("R "); 98 printf("%d %d ",step[i][2],step[i][3]); 99 } 100 //for(int i = 1;i <= n;i ++) 101 // puts(&str[i][1]); 102 return 0 ; 103 }