summaryrefslogtreecommitdiff
path: root/c++/lights_out.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c++/lights_out.cpp')
-rw-r--r--c++/lights_out.cpp46
1 files changed, 34 insertions, 12 deletions
diff --git a/c++/lights_out.cpp b/c++/lights_out.cpp
index 7dc8dc1..b35c4ee 100644
--- a/c++/lights_out.cpp
+++ b/c++/lights_out.cpp
@@ -155,20 +155,42 @@ int solve_lights_out(const Vec<MM,NN>& b, Vec<MM,NN>& x){
return 0;
}
-extern "C"{
-int solve_lights_out_dispatch(int8_t* b, int m, int n){
- if ( m == 3 and n == 3){
- Vec<3,3> b_raw;
- Vec<3,3> x;
+template<uint64_t M, uint64_t N>
+int solve_lights_out_interconnect(int8_t* b_raw){
+ Vec<M,N> b;
+
+ for(point<M,N> i{}; i.x < M && i.y < N; i.inc()){
+ auto is = i.stride();
+ b[is] = b_raw[is];
+ }
- auto rc = solve_lights_out<3,3>(b_raw,x);
- if(rc == 0) {
- for(point<3,3> i{}; i.x < 3 && i.y < 3; i.inc()){
- auto is = i.stride();
- b[is] = x[is];
- }
+ Vec<M,N> x;
+
+ auto rc = solve_lights_out<M,N>(b,x);
+ if(rc == 0) {
+ for(point<M,N> i{}; i.x < M && i.y < N; i.inc()){
+ auto is = i.stride();
+ b_raw[is] = x[is];
}
- return rc;
+ }
+ return rc;
+}
+
+extern "C"{
+int solve_lights_out_dispatch(int8_t* b_raw, int m, int n){
+
+ if ( m == 1 and n == 1){
+ return solve_lights_out_interconnect<1,1>(b_raw);
+ }else if( m == 2 and n == 2){
+ return solve_lights_out_interconnect<2,2>(b_raw);
+ }else if( m == 3 and n == 3){
+ return solve_lights_out_interconnect<3,3>(b_raw);
+ }else if( m == 6 and n == 6){
+ return solve_lights_out_interconnect<6,6>(b_raw);
+ }else if( m == 7 and n == 7){
+ return solve_lights_out_interconnect<7,7>(b_raw);
+ }else if( m == 8 and n == 8){
+ return solve_lights_out_interconnect<8,8>(b_raw);
}
return -2;
}