求助 大家帮忙找问题

recnaC 2017-09-29 01:26:43
【题目】
在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。   
下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
     
给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
【输入形式】   
输入的第一行包含一个整数n,表示要画的矩形的个数。   
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
【输出形式】   
输出一个整数,表示有多少个单位的面积被涂上颜色。
【样例输入】   
2   
1 1 4 4   
2 3 6 5
【样例输出】   
15
【评分标准】   
评测用例规模与约定   
1<=n<=100,0<=横坐标、纵坐标<=100

【我的代码】
#include <iostream>
using namespace std;
int main()
{
int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
cin>>n;
sum=0;
for (i=0;i<=n-1;i++)
{
cin>>x[i][1]>>y[i][1]>>x[i][2]>>y[i][2];
} //8-11行:输入坐标

for (i=0;i<=n-1;i++)
{
for (j=y[i][1];j<=y[i][2]-1;j++)
{ for (k=x[i][1];k<=x[i][2]-1;k++)
s[j][k]=1; //13-19行:把扫过的方格记为1,没有扫过的方格记为0
}
}

for (i=0;i<=77;i++)
{
for (j=0;j<=99;j++)
if ((s[i][j])==1)sum++;
} //21-25行:把记为1的方格的面积进行累加,可以避免重复
cout<<sum;
}


问题就是
更改
 for (i=0;i<=77;i++)
{
for (j=0;j<=99;j++)
if ((s[i][j])==1)sum++;
} //21-25行:把记为1的方格的面积进行累加,可以避免重复

的“77” (比如改为78)就会导致输出的结果不对
很奇怪啊。。。。不知道到底错在了哪儿 或者有没有简单的算法。。。
...全文
263 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
recnaC 2017-10-08
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
[quote=引用 3 楼 recnaC 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
 int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
//改为
 int n,i,j,k,l,m,sum,x[10][10],y[10][10];
static int s[99][99];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,k,sum;
	static int x[99][99];
	static int y[99][99];
	static int s[99][99];
	cin>>n;
    sum=0;
	for (i=0;i<=n-1;i++)
	 {
	 	cin>>x[i][1]>>y[i][1]>>x[i][2]>>y[i][2];
	 }                                                  //8-11行:输入坐标       
	
	for (i=0;i<=n-1;i++)
	 {
	 	for  (j=y[i][1];j<=y[i][2]-1;j++)
		 { for  (k=x[i][1];k<=x[i][2]-1;k++)
	 	   s[j][k]=1;                                   //13-19行:把扫过的方格记为1,没有扫过的方格记为0 
		 }                         
	 } 
	 
	 for (i=0;i<=99;i++) //这里注意 s 范围是 0-98 不是 0-99 改成 for( i=0;i<99;i++)
	 {
	 	for (j=0;j<=99;j++) //同上 
	 	if ((s[i][j])==1)sum++;
	 }                                                  //21-25行:把记为1的方格的面积进行累加,可以避免重复 
	 cout<<sum;
}
还是不对啊 比如输入 1 1 1 4 4 理论输出是 9才对 但是他输出的是14 算法理论上是没错的吧。。[/quote] 看红字 [/quote] 我知道了。。。错了一个很基本的问题
recnaC 2017-10-08
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
[quote=引用 3 楼 recnaC 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
 int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
//改为
 int n,i,j,k,l,m,sum,x[10][10],y[10][10];
static int s[99][99];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,k,sum;
	static int x[99][99];
	static int y[99][99];
	static int s[99][99];
	cin>>n;
    sum=0;
	for (i=0;i<=n-1;i++)
	 {
	 	cin>>x[i][1]>>y[i][1]>>x[i][2]>>y[i][2];
	 }                                                  //8-11行:输入坐标       
	
	for (i=0;i<=n-1;i++)
	 {
	 	for  (j=y[i][1];j<=y[i][2]-1;j++)
		 { for  (k=x[i][1];k<=x[i][2]-1;k++)
	 	   s[j][k]=1;                                   //13-19行:把扫过的方格记为1,没有扫过的方格记为0 
		 }                         
	 } 
	 
	 for (i=0;i<=99;i++) //这里注意 s 范围是 0-98 不是 0-99 改成 for( i=0;i<99;i++)
	 {
	 	for (j=0;j<=99;j++) //同上 
	 	if ((s[i][j])==1)sum++;
	 }                                                  //21-25行:把记为1的方格的面积进行累加,可以避免重复 
	 cout<<sum;
}
还是不对啊 比如输入 1 1 1 4 4 理论输出是 9才对 但是他输出的是14 算法理论上是没错的吧。。[/quote] 看红字 [/quote] 98怎么来的呀。。。。为什么99就不对呢
liu1xiang 2017-10-01
  • 打赏
  • 举报
回复
真相重于对错 2017-10-01
  • 打赏
  • 举报
回复
引用 3 楼 recnaC 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:]
 int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
//改为
 int n,i,j,k,l,m,sum,x[10][10],y[10][10];
static int s[99][99];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,k,sum;
	static int x[99][99];
	static int y[99][99];
	static int s[99][99];
	cin>>n;
    sum=0;
	for (i=0;i<=n-1;i++)
	 {
	 	cin>>x[i][1]>>y[i][1]>>x[i][2]>>y[i][2];
	 }                                                  //8-11行:输入坐标       
	
	for (i=0;i<=n-1;i++)
	 {
	 	for  (j=y[i][1];j<=y[i][2]-1;j++)
		 { for  (k=x[i][1];k<=x[i][2]-1;k++)
	 	   s[j][k]=1;                                   //13-19行:把扫过的方格记为1,没有扫过的方格记为0 
		 }                         
	 } 
	 
	 for (i=0;i<=99;i++) //这里注意 s 范围是 0-98 不是 0-99 改成 for( i=0;i<99;i++)
	 {
	 	for (j=0;j<=99;j++) //同上 
	 	if ((s[i][j])==1)sum++;
	 }                                                  //21-25行:把记为1的方格的面积进行累加,可以避免重复 
	 cout<<sum;
}
还是不对啊 比如输入 1 1 1 4 4 理论输出是 9才对 但是他输出的是14 算法理论上是没错的吧。。[/quote] 看红字
开心秋水 2017-10-01
  • 打赏
  • 举报
回复
建议这些整型的数或数组在声明时进行初始化
OldHello 2017-09-30
  • 打赏
  • 举报
回复
引用 4 楼 recnaC 的回复:
[quote=引用 1 楼 a645328869 的回复:]
经测试未发现楼主所说的错误

你试试输入
1
1 1 4 4
应该输出的是9 但是。。总是莫名其妙的多出来了5啊、、
[/quote]

引用 4 楼 recnaC 的回复:
[quote=引用 1 楼 a645328869 的回复:]
经测试未发现楼主所说的错误

你试试输入
1
1 1 4 4
应该输出的是9 但是。。总是莫名其妙的多出来了5啊、、
[/quote]
赵4老师 2017-09-30
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
recnaC 2017-09-29
  • 打赏
  • 举报
回复
引用 1 楼 a645328869 的回复:
经测试未发现楼主所说的错误
你试试输入 1 1 1 4 4 应该输出的是9 但是。。总是莫名其妙的多出来了5啊、、
recnaC 2017-09-29
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
 int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
//改为
 int n,i,j,k,l,m,sum,x[10][10],y[10][10];
static int s[99][99];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,k,sum;
	static int x[99][99];
	static int y[99][99];
	static int s[99][99];
	cin>>n;
    sum=0;
	for (i=0;i<=n-1;i++)
	 {
	 	cin>>x[i][1]>>y[i][1]>>x[i][2]>>y[i][2];
	 }                                                  //8-11行:输入坐标       
	
	for (i=0;i<=n-1;i++)
	 {
	 	for  (j=y[i][1];j<=y[i][2]-1;j++)
		 { for  (k=x[i][1];k<=x[i][2]-1;k++)
	 	   s[j][k]=1;                                   //13-19行:把扫过的方格记为1,没有扫过的方格记为0 
		 }                         
	 } 
	 
	 for (i=0;i<=99;i++)
	 {
	 	for (j=0;j<=99;j++)
	 	if ((s[i][j])==1)sum++;
	 }                                                  //21-25行:把记为1的方格的面积进行累加,可以避免重复 
	 cout<<sum;
}
还是不对啊 比如输入 1 1 1 4 4 理论输出是 9才对 但是他输出的是14 算法理论上是没错的吧。。
赵4老师 2017-09-29
  • 打赏
  • 举报
回复
 int n,i,j,k,l,m,sum,x[10][10],y[10][10],s[99][99];
//改为
 int n,i,j,k,l,m,sum,x[10][10],y[10][10];
static int s[99][99];//在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
OldHello 2017-09-29
  • 打赏
  • 举报
回复
经测试未发现楼主所说的错误

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧