Source file: /~heha/hs/Kalenderpuzzle.zip/src/kp.h

#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-80