求大神解释啊,我思考了一个星期的题目,现在竟然连答案都看不懂

是吻过的尘埃风过 2014-03-17 04:52:05
给定矩阵由0,1组成,使用最少的改变(使0变成1),使得任何元素的上下左右元素(如果存在)和为偶数

输入: 测试组数, 矩阵大小n ,矩阵每一个数

输出: 最小翻转次数,无法实现则输出-1
有谁能给我解释一下下面代码的check()函数和整段代码的思路,谢谢!

#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

#define zero(a) memset(a,0,sizeof(a))
#define one(a) memset(a,1,sizeof(a))
#define fone(a) memset(a,-1,sizeof(a))
#define pow2(a) ((a)*(a))
#define pow3(a) ((pow2(a))*(a))
#define MAX 10000000
struct{
int x,y;
}a[20][20];
int n;


int check(int k)
{
int i;
for(i=0;i<n;i++)
a[0][i].y=0;
i=0;
while(k)
{
a[0][i].y=k%2;
k=k/2;
i++;
}

for(i=0;i<n;i++)
if(a[0][i].x==1&&a[0][i].y==0)
return -1;

return 0;
}
int fun()
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n;j++)
{
int sum=0;
if(i>=2)
sum+=a[i-2][j].y;
if(j>0)
sum+=a[i-1][j-1].y;
if(j<n-1)
sum+=a[i-1][j+1].y;
if(sum%2==0)
a[i][j].y=0;
else
a[i][j].y=1;
if(a[i][j].y==0&&a[i][j].x==1)
return MAX;
}

}

int cnt=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j].x==0&&a[i][j].y==1)
cnt++;

return cnt;
}
int main()
{
int T;
int cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j].x);
}
}

int ans=MAX;

for(i=0;i<(1<<n);i++)
{
if(check(i)==-1)
continue;
ans=min(ans,fun());
}
if(ans!=MAX)
printf("Case %d: %d\n",cas++,ans);
else
printf("Case %d: -1\n",cas++);
}
return 0;
}

...全文
232 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 adfaksdf 的回复:
设个断点,调试一下不就行了么?
恩恩,正在进行中,
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
输入较小的测试数据,单步或设断点跟踪之。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
恩恩,确实是,我偷懒了,结果绕得还远,今天晚上就发篇文章,关于这个问题的呢,
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
输入较小的测试数据,单步或设断点跟踪之。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
adfaksdf 2014-03-19
  • 打赏
  • 举报
回复
设个断点,调试一下不就行了么?
  • 打赏
  • 举报
回复
引用 1 楼 yunchao630 的回复:
假如你所述属实,谁叫你当初不写注释呢
人家才写不出这么吊的代码,这是别人写的,求解释!
xiaoyao18301 2014-03-17
  • 打赏
  • 举报
回复
翅膀又硬了 2014-03-17
  • 打赏
  • 举报
回复
假如你所述属实,谁叫你当初不写注释呢

65,208

社区成员

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

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