#pragma once
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <windowsx.h> // Makros
#include <shlwapi.h> // nützliche Funktionen
#include <commctrl.h>
#define _USE_MATH_DEFINES
#include <math.h>
/************
* Globales *
************/
#ifdef UNICODE
# define CF_TXT CF_UNICODETEXT
# ifndef _UNICODE
# define _UNICODE
# endif
#else
# define CF_TXT CF_TEXT
#endif
#include <stdio.h>
#include <tchar.h>
#define elemof(x) (sizeof(x)/sizeof((x)[0]))
#define T(x) TEXT(x)
#define nobreak
#ifdef WIN32
# define Send_WM_Command(ToWnd,CtlId,NotifyCode,FromWnd)\
SendMessage(ToWnd,WM_COMMAND,MAKELONG(CtlId,NotifyCode),(LPARAM)FromWnd);
#else // Win16
# define Send_WM_Command(ToWnd,CtlId,NotifyCode,FromWnd)\
SendMessage(ToWnd,WM_COMMAND,CtlId,MAKELONG((UINT)FromWnd,NotifyCode));
#endif
void _cdecl DebugPrintf(const char*,...);
#ifdef _DEBUG
# define _debug(x) DebugPrintf x
#else
# define _debug(x) {}
#endif
/*** PiezoMess.cpp ***/
extern HINSTANCE ghInstance;
extern HWND ghMainWnd;
struct RECTS{
short left,top,right,bottom;
void operator=(const RECT&r) {
left=(short)r.left;
top=(short)r.top;
right=(short)r.right;
bottom=(short)r.bottom;
}
void toRect(RECT&r) const{
r.left=left;
r.top=top;
r.right=right;
r.bottom=bottom;
}
};
extern struct CONFIG{
RECTS WndPos;
char ShowCmd;
WORD flags; // Bit 0:Mit Rückseiten
}Config;
void _fastcall InitStruct(PVOID,UINT);
typedef const TCHAR*PCTSTR;
int _cdecl MBox(HWND,PCTSTR,DWORD,...);
enum{
MB_Sound = 0x00200000L, // Ton ausgeben
MB_ErrorText = 0x00400000L, // System-Fehlerbescheibung (1. DWORD-Argument) nach 1 Leerzeile anhängen
};
/***************
* Puzzledaten *
***************/
struct Koord{
char x,y,d; // d[1:0] = Drehung rechtsherum, d[2] = Spiegelung um Y-Achse
};
union Bitmap8x8{
byte b[8];
unsigned __int64 ull;
};
union Bitmap4x4{
byte b[4]; // nur Low-Nibble genutzt
unsigned u;
};
/* Das Puzzle ist tatsächlich nicht für jeden Tag mit nur Rückseiten lösbar!
Derzeit wird nur die jeweils erste Lösung ausgespuckt.
*/
struct Piece{
// static const int N=8;
enum{N=8}; // Anzahl Stücke
Bitmap8x8 bm; // 4×4 genutzt mit Verschiebung innerhalb 7×7
int xe,ye; // Ausdehnung des Puzzlestücks
void operator=(Bitmap4x4);
void transposeFrom(const Piece&); // Um Hauptdiagonale spiegeln
void mirrorFrom(const Piece&); // horizontal spiegeln
void flipFrom(const Piece&); // vertikal spiegeln
inline void shift(int d) {bm.ull<<=d;}
inline operator bool() const {return xe&&ye;}
};
struct Field{
Bitmap8x8 bm;
bool prepare(int monat,int tag); // false nur bei falschem Monat oder Tag
inline bool add(const Piece&p) { // false wenn Puzzlestück nicht an dieser Position legbar
if (~bm.ull&p.bm.ull) return false;
bm.ull&=~p.bm.ull; // Puzzleteil von Freifläche wegnehmen
return true;
}
inline void remove(const Piece&p) { // Nur aufrufen wenn add() erfolgreich war
bm.ull|=p.bm.ull; // Puzzleteil zur Freifläche hinzufügen
}
};
extern struct Solver{
Field f; // Aktuelles Feld: Freifelder = 1-Bits
Piece cache[Piece::N][8]; // Cache der Teile (rotiert und gespiegelt)
Koord k[Piece::N]; // Aktuelle Verschiebungen und Drehungen der Puzzleteile
int depth;
bool puzzle(); // rekursive Funktion
bool solve(int monat,int tag,WORD flags);
void paint(HDC) const;
}solver;
Detected encoding: UTF-8 | 0
|