打地鼠

来源:互联网 发布:saas软件代理协议 编辑:程序博客网 时间:2024/05/20 03:06

 

 
Description:
 
相信大家都玩过打地鼠游戏吧!就是在一个n*m矩形区域内有n*m个洞,然后地鼠可能在任意一个洞中出来。现在一个小朋友正在玩这个游戏,他不想像正常玩游戏一样,要自己看着,现在他要买一些机器人来帮他,这些机器人很厉害,一个就可以顶上十个,原因很简单,他可以打中所有出现在和它同行或同列的地鼠,但是他也有个弊端,一旦放到一个位置了就不能在动了,而且这些机器人只能放在矩形的外围。当然了,他也想省点钱,现在他已经计算出了地鼠将要出现的位置,要你帮他计算一下他最少要买多少个机器人。
Input
输入包括多组数据。首先输入nm(1<=n,m<=300)代表矩形的大小,接下来一行输入k(1<=k<=n*m),表示有k个位置地鼠将出现的,然后跟着k行,每一行包括两个数x(1<=x<=n)y(1<=y<=m),表示k个可能的位置。当录入的n= m=0时,程序结束。
 
Output
 
输出最少的机器人数,每组数据占一行,相邻的两组用空格隔开。
 
Sample Input
5 5
3
1 2
2 3
4 5
6 5
5
1 2
1 3
2 3
3 3
6 4
 
Sample Output
3
    
3
 
 
code:
Code:
  1. #include<stdio.h>   
  2. #include<string.h>   
  3.   
  4. int n, m;//范围  
  5. int number;//地鼠的总数  
  6. int array1[300][300];   
  7. void draw_pic(int (*array)[300]);//构造二维数组,包含地鼠的出现位置和行列对应的地鼠数目  
  8. void print_pic(int (*array)[300]);//打印数组  
  9. int get_x_max(int (*array)[300]);//返回行的地鼠数目最大值  [array[0][1],array[0][m]]  
  10. int get_y_max(int (*array)[300]);//[array[1][0],array[n][0]]  
  11. void make(int (*array)[300]);//打地鼠  
  12.   
  13. int main()   
  14. {   
  15.   
  16.     int x, y;   
  17.     int j, k;   
  18.     int p,p1,p2;   
  19.     int array[300][300];   
  20.     int z;   
  21.     scanf("%d %d", &n, &m);   
  22.     for(j = 0; j <= n; j++)   
  23.     {   
  24.         for(k = 0; k <= m; k++)   
  25.         {   
  26.             array[j][k] = 0;   
  27.         }   
  28.     }   
  29.     scanf("%d", &number);   
  30.     for(p = 0; p < number; p++)   
  31.     {   
  32.         scanf("%d %d", &p1, &p2);   
  33.         array[p1][p2] = 1;   
  34.     }   
  35.     printf("/n/n");   
  36. //  memcpy(array1,array,sizeof(array));   
  37.     draw_pic(array);   
  38.     print_pic(array);   
  39.     //printf("/n/nx:%d,y:%d",get_y_max(array),get_y_max(array));  
  40.     //printf("/n/n[0][3]:%d",array[0][3]);  
  41.     //printf("/n/nmaxx:%d/tmaxy:%d",array[0][get_x_max(array)],array[get_y_max(array)][0]);  
  42.     make(array);   
  43.     while(array[0][get_x_max(array)]>1 || array[get_y_max(array)][0]>1)//如果每行最多只有一个地鼠,则结束循环  
  44.     {   
  45.         draw_pic(array);//打过地鼠后再次绘制数组  
  46.         make(array);   
  47.     }   
  48.        
  49.     printf("/n/n/nneed:%d robot!/n/n", number);   
  50. //  print_pic(array1);   
  51. //      print_pic(array);   
  52.   
  53.     return 0;   
  54. }   
  55.   
  56. void draw_pic(int (*array)[300])   
  57. {   
  58.     int j, k;   
  59.     int temp;   
  60.     for(int t = 0; j <= n; j++)//置零  
  61.     {   
  62.         for(int r = 0; k <= m; k++)   
  63.         {   
  64.             array[t][r] = 0;   
  65.         }   
  66.     }   
  67.     for(j = 1; j <= n; j++)//行扫描  
  68.     {   
  69.         temp = 0;   
  70.         for(k = 1; k <= m; k++)   
  71.         {   
  72.             if(array[j][k]==1)   
  73.             {   
  74.                 temp++;   
  75.             }   
  76.         }   
  77.         if(temp>=1)   
  78.         {   
  79.             array[j][0] = temp;   
  80.             //for(k =1; k <= m; k++)   
  81.             //  array[j][k]=0;  
  82.             //number-=(temp-1);   
  83.         }   
  84.        
  85.     }   
  86.     for(j = 1; j <= m; j++)//列扫描  
  87.     {   
  88.         temp =0;   
  89.         for(k = 1; k <= n; k++)   
  90.         {   
  91.             if(array[k][j]==1)   
  92.             {   
  93.                 temp++;   
  94.             }   
  95.         }   
  96.         if(temp>=1)   
  97.         {   
  98.             array[0][j] = temp;   
  99.             //for(k =1; k <= n; k++)  
  100.             //  array[k][j]=0;   
  101.             //number-=(temp-1);  
  102.         }   
  103.            
  104.     }   
  105.        
  106. }   
  107.   
  108. void print_pic(int (*array)[300])   
  109. {   
  110.     int j, k;   
  111.     for(j= 0; j <= n; j++)   
  112.     {   
  113.         for(k = 0; k <= m; k++)   
  114.         {   
  115.                 if(j == 0 || k == 0)   
  116.                     printf("%d ",array[j][k]);   
  117.                    
  118.                 else if(array[j][k] == 1)   
  119.                 {   
  120.                     printf("@ ");   
  121.                 }   
  122.                 else    
  123.                     printf("x ");   
  124.         }   
  125.         printf("/n");   
  126.     }   
  127. }   
  128.   
  129. int get_x_max(int (*array)[300])   
  130. {   
  131.     int max = 0;   
  132.     for(int k = 1; k <= n; k++)   
  133.     {   
  134.         if(array[0][max] < array[0][k])   
  135.             max = k;   
  136.     }   
  137. //  printf("!!!%d",max);   
  138.     return max;   
  139. }   
  140.   
  141.   
  142.   
  143. int get_y_max(int (*array)[300])   
  144. {   
  145.     int max = 0;   
  146.     for(int k = 1; k <= m; k++)   
  147.     {   
  148.         if(array[max][0] < array[k][0])   
  149.             max = k;   
  150.     }   
  151.     return max;   
  152. }   
  153.   
  154. void make(int (*array)[300])   
  155. {   
  156.     int k;   
  157.     if(array[0][get_x_max(array)]>=array[get_y_max(array)][0])   
  158.     {   
  159.             for(k =1; k <= n; k++)   
  160.                 array[k][get_x_max(array)]=0;   
  161.             number -=(array[0][get_x_max(array)]-1);    
  162.             array[0][get_x_max(array)] = 0;   
  163. //          array1[0][get_x_max(array)] = 99;  
  164.     }   
  165.     else  
  166.     {   
  167.             for(k =1; k <= m; k++)   
  168.                 array[get_y_max(array)][k]=0;   
  169.             number -=(array[get_y_max(array)][0]-1);    
  170.             array[get_y_max(array)][0] = 0;   
  171. //          array1[get_y_max(array)][0] = 99;  
  172.     }   
  173.     //printf("/n/n");   
  174.     //draw_pic(array);   
  175. }   
 
原创粉丝点击