欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

多米诺骨牌(洛谷-P1282)

发布时间:2025/3/17 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 多米诺骨牌(洛谷-P1282) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述

多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的

上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。

对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。

输入输出格式

输入格式:

输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。

输出格式:

输出文件仅一行,包含一个整数。表示求得的最小旋转次数。

输入输出样例

输入样例#1:

4
6 1
1 5
1 3
1 2

输出样例#1:

1

源代码

#include<iostream> #include<cstring> using namespace std; int min(int x,int y)//比较函数 {if(x>y)return y;elsereturn x; } int dp[1010][12010]; int main() {int n,top[1001],under[1001];int sum[1001],result;int i,j;cin>>n;//输入牌数for(i=1;i<=n;i++) {cin>>top[i]>>under[i];//输入上方、下方点数sum[i]=top[i]-under[i];//每一组牌的上下差值}memset(dp,1,sizeof(dp));//将dp数组全部赋1值dp[0][5000]=0;for(i=1;i<=n;i++)//从第一组牌开始比较for(j=-5000;j<=5000;j++)//最小情况为上方1000张全为1,下方1000全为6;最大情况为上方1000张全为6,下方1000全为1dp[i][j+5000]=min(dp[i-1][j+5000-sum[i]] , dp[i-1][j+5000+sum[i]]+1);//比较每一次是翻转还是不翻转得到的值最小for(i=0;i<=5000;i++){result=min(dp[n][i+5000],dp[n][-i+5000]);//比较每次是翻转或不翻转小if(result<=1000)//因为最多有1000张牌,因此最多移动1000次{cout<<result<<endl;break;}}return 0; }

 

总结

以上是生活随笔为你收集整理的多米诺骨牌(洛谷-P1282)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。