打地鼠
来源:互联网 发布:saas软件代理协议 编辑:程序博客网 时间:2024/05/20 03:06
Description:
相信大家都玩过打地鼠游戏吧!就是在一个n*m矩形区域内有n*m个洞,然后地鼠可能在任意一个洞中出来。现在一个小朋友正在玩这个游戏,他不想像正常玩游戏一样,要自己看着,现在他要买一些机器人来帮他,这些机器人很厉害,一个就可以顶上十个,原因很简单,他可以打中所有出现在和它同行或同列的地鼠,但是他也有个弊端,一旦放到一个位置了就不能在动了,而且这些机器人只能放在矩形的外围。当然了,他也想省点钱,现在他已经计算出了地鼠将要出现的位置,要你帮他计算一下他最少要买多少个机器人。
Input
输入包括多组数据。首先输入n和m(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:
- #include<stdio.h>
- #include<string.h>
- int n, m;//范围
- int number;//地鼠的总数
- int array1[300][300];
- void draw_pic(int (*array)[300]);//构造二维数组,包含地鼠的出现位置和行列对应的地鼠数目
- void print_pic(int (*array)[300]);//打印数组
- int get_x_max(int (*array)[300]);//返回行的地鼠数目最大值 [array[0][1],array[0][m]]
- int get_y_max(int (*array)[300]);//[array[1][0],array[n][0]]
- void make(int (*array)[300]);//打地鼠
- int main()
- {
- int x, y;
- int j, k;
- int p,p1,p2;
- int array[300][300];
- int z;
- scanf("%d %d", &n, &m);
- for(j = 0; j <= n; j++)
- {
- for(k = 0; k <= m; k++)
- {
- array[j][k] = 0;
- }
- }
- scanf("%d", &number);
- for(p = 0; p < number; p++)
- {
- scanf("%d %d", &p1, &p2);
- array[p1][p2] = 1;
- }
- printf("/n/n");
- // memcpy(array1,array,sizeof(array));
- draw_pic(array);
- print_pic(array);
- //printf("/n/nx:%d,y:%d",get_y_max(array),get_y_max(array));
- //printf("/n/n[0][3]:%d",array[0][3]);
- //printf("/n/nmaxx:%d/tmaxy:%d",array[0][get_x_max(array)],array[get_y_max(array)][0]);
- make(array);
- while(array[0][get_x_max(array)]>1 || array[get_y_max(array)][0]>1)//如果每行最多只有一个地鼠,则结束循环
- {
- draw_pic(array);//打过地鼠后再次绘制数组
- make(array);
- }
- printf("/n/n/nneed:%d robot!/n/n", number);
- // print_pic(array1);
- // print_pic(array);
- return 0;
- }
- void draw_pic(int (*array)[300])
- {
- int j, k;
- int temp;
- for(int t = 0; j <= n; j++)//置零
- {
- for(int r = 0; k <= m; k++)
- {
- array[t][r] = 0;
- }
- }
- for(j = 1; j <= n; j++)//行扫描
- {
- temp = 0;
- for(k = 1; k <= m; k++)
- {
- if(array[j][k]==1)
- {
- temp++;
- }
- }
- if(temp>=1)
- {
- array[j][0] = temp;
- //for(k =1; k <= m; k++)
- // array[j][k]=0;
- //number-=(temp-1);
- }
- }
- for(j = 1; j <= m; j++)//列扫描
- {
- temp =0;
- for(k = 1; k <= n; k++)
- {
- if(array[k][j]==1)
- {
- temp++;
- }
- }
- if(temp>=1)
- {
- array[0][j] = temp;
- //for(k =1; k <= n; k++)
- // array[k][j]=0;
- //number-=(temp-1);
- }
- }
- }
- void print_pic(int (*array)[300])
- {
- int j, k;
- for(j= 0; j <= n; j++)
- {
- for(k = 0; k <= m; k++)
- {
- if(j == 0 || k == 0)
- printf("%d ",array[j][k]);
- else if(array[j][k] == 1)
- {
- printf("@ ");
- }
- else
- printf("x ");
- }
- printf("/n");
- }
- }
- int get_x_max(int (*array)[300])
- {
- int max = 0;
- for(int k = 1; k <= n; k++)
- {
- if(array[0][max] < array[0][k])
- max = k;
- }
- // printf("!!!%d",max);
- return max;
- }
- int get_y_max(int (*array)[300])
- {
- int max = 0;
- for(int k = 1; k <= m; k++)
- {
- if(array[max][0] < array[k][0])
- max = k;
- }
- return max;
- }
- void make(int (*array)[300])
- {
- int k;
- if(array[0][get_x_max(array)]>=array[get_y_max(array)][0])
- {
- for(k =1; k <= n; k++)
- array[k][get_x_max(array)]=0;
- number -=(array[0][get_x_max(array)]-1);
- array[0][get_x_max(array)] = 0;
- // array1[0][get_x_max(array)] = 99;
- }
- else
- {
- for(k =1; k <= m; k++)
- array[get_y_max(array)][k]=0;
- number -=(array[get_y_max(array)][0]-1);
- array[get_y_max(array)][0] = 0;
- // array1[get_y_max(array)][0] = 99;
- }
- //printf("/n/n");
- //draw_pic(array);
- }
- 打地鼠
- 打地鼠
- 打地鼠
- 打地鼠
- 打地鼠
- 打地鼠
- 模拟打地鼠游戏
- cocos2D 打地鼠游戏
- 打地鼠小结
- Unity3D打地鼠
- 【SDOI 2011】打地鼠
- Libgdx打地鼠一
- 【SDOI2011】打地鼠
- bzoj2241: [SDOI2011]打地鼠
- 简易打地鼠
- bzoj2241【sdoi2011】打地鼠
- BZOJ1207【HNOI2004】打地鼠
- java打地鼠游戏
- 谁能给一些java手机开发的学习资料
- 毕业设计的日子
- 隐藏已知文件类型的扩展名选项不可用
- 介绍一个打字练习软件——计算机达人成长之路(29)
- 我的大学
- 打地鼠
- 今天加入CSDN
- 例程:二进制序列化和Soap序列化
- web技术
- 今天真是忙得不亦乐乎!
- Linux知识99问
- Linux操作系统中七件超厉害的武器
- Linux 文件系统精通指南
- Linux 基本概念及常用命令