n色方柱问题 把算法变成代码

问题描述

n色方柱问题 把算法变成代码

void search()
{
int i,t,cube,newg,over,ok;
int *vert=new int[n];
int *edge=new int[n*2];
for(i=0;i
t=-1;newg=1;
while(t>-2){
t++;
cube=t%n; //每个立方体找2次
if(newg)edge[t]=-1;
over=0;ok=0;
while(!ok && !over){
edge[t]++;
if(edge[t]>2)over=1; //每个立方体只有3条边
else ok=(t
}
if(!over){
if(++vert[board[cube][edge[t]*2]]>2+t/n*2)ok=0;
if(++vert[board[cube][edge[t]*2+1]]>2+t/n*2)ok=0;
if(t%n==n-1&&ok) //check that each vertex is order 2
for(i=0;i2+t/n*2)ok=0;
if(ok){if(t==n*2-1){ //找到解
ans++;
out(edge);
return;
}
else newg=1;
} //ok
else{ //取下一条边
--vert[board[cube][edge[t]*2]];
--vert[board[cube][edge[t]*2+1]];
t--;newg=0;
}
} //over
else{ //回溯
t--;
if(t>-1){
cube=t%n;
--vert[board[cube][edge[t]*2]];
--vert[board[cube][edge[t]*2+1]];
}
t--;newg=0;
}
}

}

找到一个解由out输出。

void out(int edge[])
{
int k,a,b,c,d;
for(int i=0;i<2;i++){
for(int j=0;j<n;j++) used[j]=0;
do{
j=0; //找下一条未用边
d=c=-1;
while(j<n&&used[j]) j++;
if(j<n)
do{
a=board[j][edge[i*n+j]*2];
b=board[j][edge[i*n+j]*2+1];
if(b==d)(k=a;a=b;b=k;)
solu[j][i*2]=a;
solu[j][i*2+1]=b;
used[j]=1;
if(c<0)c=a; //开始顶点
d=b;
for(k=0;k<n;k++) //找下一个立方体
if(!used[k]&&(board[k][edge[i*n+k]*2]==b ||
board[k][edge[i*n+k]*2+1]==b))j=k;
}while(b!=c);
}while(j<n);
}
for(int j=0;j<n;j++){
k=3-edge[j]-edge[j+n];
a=board[j][k*2];
b=board[j][k*2+1];
solu[j][4]=a;
solu[j][5]=b;
}
for(i=0;i<n;i++){
for(j=0;j<6;j++)
cout<<color[solu[i][j]];
cout<<endl;
}

}

执行算法的主要函数如下

int main()
{
readin();
search();
if(ans==0)cout<<"No Solution!"<<endl;
return 0;

}

初始数据由readin读入。

void readin()
{
fin>>n;
Make2DArray(board,n,6);
Make2DArray(solu,n,6);
color=new char[n];
used=new int[n];
for(int j=0;j>color[j];
for(int i=0;i
for(int j=0;j>board[i][j];
}

解决方案

这不是已经有代码了么?请问有什么问题?还是代码有错?请说清楚

时间: 2024-08-02 07:08:39

n色方柱问题 把算法变成代码的相关文章

字母全排列快速算法C代码

全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA. //原理是插入, 在一个字符串的所有位置插入新字符.//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABCchar *AllList(char *str, int *pNum)...{ int i, j, k, n; int len = strlen(str); int Total = 0; int count, oldcount;

C++ kmp算法模板代码解读

C++编程语言虽然功能强大,应用方式灵活,但是在实际编程中同样会出现各种各样的错误.在这里我们将会为大家详细介绍一下有关C++指针漂移的解决方法,希望本文介绍的内容可以帮助大家解决问题. 最近我们在工作中碰到一个奇怪的问题,最后确定是多继承引起的C++指针漂移,跟C++对象模型有关.示意如下: class A {...}; class B{...}; class AB : public B, public A {...} ... AB *pab = new AB(); A* pa = (A*)p

一组PHP可逆加密解密算法实例代码

 这篇文章主要介绍了一组PHP可逆加密解密算法实例代码,有需要的朋友可以参考一下 对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密.   对于需要还原的信息,则需要采用可逆的加密解密算法.   下面一组PHP函数是实现此加密解密的方法:   加密算法如下: 代码如下: function encrypt($data, $key) {  $key = md5($key);     $x  = 0;     $len = strlen

opengl-请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码!

问题描述 请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码! 1C 请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码!不用graphics.h的,而是用glut的,急,在线等! 解决方案 opencv,或者opengl里面应该有哇 解决方案二: 参考:http://blog.163.com/liuguangqian_866/blog/static/43036601200831885421980/ 解决方案三: http://blog.csdn.net/trent198

谁有基于用户的推荐系统或者协同过滤的算法和代码分析啊

问题描述 求个大数据的大神给个基于用户的推荐系统或者协同过滤的算法和代码分析啊我有部分代码但是不知道怎么在Eclipse上实现求解答啊1.publicclassAggregateAndRecommendReducerextendsReducer<VarLongWritable,VectorWritable,VarLongWritable,RecommendedItemsWritable>{...publicviodreduce(VarLongWritablekey,Iterable<Ve

毕业论文-求大神给个无线传感器网络基于rssi测距的加权质心算法matlab代码的

问题描述 求大神给个无线传感器网络基于rssi测距的加权质心算法matlab代码的 急用代码-能不能给一点定位和目标跟踪的 解决方案 http://wenku.baidu.com/link?url=toEogyXL99LGEJaBMOVmDoYO9AsFkrc1U3bxa-PilQOZk6RjFVikigloEi0lqqRNBmgPLHUlYBqLKu23R5jLHn3rwckl5NmdAOP47VEFf5S 解决方案二: 求大神-必谢谢-407883995微信号

struct-下面实现算术优先级算法的代码怎么输不出结果?实在找不出错,请大神指导

问题描述 下面实现算术优先级算法的代码怎么输不出结果?实在找不出错,请大神指导 #include #include #define ok 1 #define ERROR 0 char an[7]={'+','-','*','/','(',')','='}; unsigned char Prior[7][7]= { // '+' '-' '*' '/' '(' ')' '=' /*'+'*/'>','>','<','<','<','>','>', /*'-'*/'&

算法实现-求解利用最长公共子序列进行字符串重排序算法的代码

问题描述 求解利用最长公共子序列进行字符串重排序算法的代码 利用合并LCS表求出一张基于所给连接词二进制的表,利用这张表和连接词k再反过来求出LCS表

Android中关于递归和二分法的算法实例代码_Android

// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9,11,45}; int index=findIndext(arr,0,arr.length-1,12); System.out.println("index="+index); } // 1