#include <stdio.h> #include <stdint.h> #include <inttypes.h> // "%" PRIx64; %llx #include <mmintrin.h> #include <pthread.h>/* 用+y和-y判断斜线 0 Q......Q 3 ..Q..... 4 ...Q.... 5 ..Q..... 7 Q......Q */typedef unsigned char byte; byte __attribute__((aligned(64))) _b[8][8][8]; int cnt[8]; pthread_t tid[8];void search (int i, int cy) { // idx, current_ybyte (&b)[8][8] = _b[i];for (int x = 0; x < 8; x++) {byte (&c)[8] = b[cy];c[0] = x; c[1] = x + cy; c[2] = x - cy;bool ok = true;for (int y = 0; y < cy; y++) {const uint64_t r = uint64_t(_mm_cmpeq_pi8(*(__m64*)c, *(__m64*)b[y]));_mm_empty();//if (c[0] == b[y][0] || c[1] == b[y][1] || c[2] == b[y][2])//if (c[0] == b[y][0] | c[1] == b[y][1] | c[2] == b[y][2])if (r & 0xFFFFFF)// 以上三个if都对。吾朽矣,烦请好事者比较汇编代码 :-){ ok = false; break; }}if (!ok) continue;if (cy == 7) ++cnt[i];else search(i, cy + 1);} }void* tfn (void* arg) {int i = int(long(arg));_b[i][0][0] = _b[i][0][1] = _b[i][0][2] = i;search(i, 1); return 0; }int main () {enum { N = 8 };for (int i = 0; i < N; i++) pthread_create(tid+i, NULL, tfn, (void*)long(i));for (int i = 0; i < N; i++) pthread_join(tid[i], NULL);int n = 0;for (int i = 0; i < N; i++) printf("%d\n", n += cnt[i]); }