锘??xml version="1.0" encoding="utf-8" standalone="yes"?>Clang 瀹忓畾涔夊垵鎺紙浜岋級
鏈瘒鎬葷粨涓嬭繖鍑犲ぉ鐪嬬殑瀹忕殑涓浜涚湅鍒扮殑鐢ㄦ硶銆?br />1銆佸弬鏁扮矘緇?/h2>榪欐槸涓涓被浼?shell 涔嬬被鐨勮剼鏈璦鐨勭壒鎬э紝鍙互鍒╃敤榪欎釜鐗規(guī)у畬鎴愪竴浜涢噸澶嶅害姣旇緝楂樼殑緙栫爜鐨勭畝鍖栥?br />渚嬪錛屽proc鏂囦歡緋葷粺榪涜緇戝畾鐨勬椂鍊欙紝闇瑕佸湪/proc/test/鐩綍涓嬶紝綆鍘?涓枃浠舵帴鍙o紝test1銆乼est2銆乼est3.
鍙互榪欐牱鍐?br />
BIND(2); //灞曞紑涓簍est2->read_proc=test2_read;
涓嶇鏄粠璇箟榪樻槸緙栫爜澶嶆潅搴︼紝閮介檷浣庝簡銆?br />2銆佸弬鏁板瓧絎﹀寲
鍦ㄤ嬌鐢ㄥ崟涓?# 鍙鳳紝浣滀負鍑芥暟寮忓畯鐨勫弬鏁板墠緙鏃訛紝鍙互璁╁畯鐨勫唴瀹瑰彉鎴愬瓧絎︿覆錛屾瘮濡傝錛?br />
printf(#x);\
printf("=%d\n",x);\
}while(0)
print(t);3銆乨o{...}while(0) 鍜?({...})
鍙互璁や負鏄墠鑰呮槸 void 鍑芥暟錛屽悗鑰呮槸鏈?return 鍊肩殑鍑芥暟銆?br />鍏?涓墍紺猴紝do{...}while(0) 鏄負浜嗕駭鐢熶竴涓▼搴忓潡錛屽綋瀹忛噷鏈夊鏉¢渶瑕佽鍙ラ渶瑕佹墽琛屾椂錛屽鏋滀笉閫傜敤榪欑do{...}while(0)鐨勫艦寮忥紝鍙兘瀵艱嚧涓浜涢殣褰㈢殑閿欒,渚嬪錛?br />
print(t); 鏄病鏈夐棶棰樼殑錛屼絾鏄鏋滄斁鍦ㄧ▼搴忔閲岋細
print(t);
else
print(a);
{printf("t");printf("=%d\n",t);};
else
4銆佸閲嶅睍寮
榪樻槸鍩轟簬鎵撳嵃鐨勪緥瀛愶紝鎴戦渶瑕佹墦鍗頒竴浜涘垪涓劇殑鍙傛暟鍊鹼細
#define print(x) do{printf(#P(x));printf("=%d\n",P(x));}while(0)
#define __print(x) do{printf(#x);printf("=%d\n",x);}while(0)
#define _print(x) __print(x)
#define print(x) _print(P(x))
print(1);
涓昏娑夊強鐨勯棶棰樺湪浜庡畯鐨勫嬈″睍寮錛屽畯姣忔灞曞紑鍙細瀵瑰綋鍓嶇殑杈撳叆鍙傛暟榪涜涓嬈″睍寮錛屽綋浣犵殑杈撳叆鍊間篃鏄釜瀹忕殑鏃跺欙紝灝遍渶瑕佷嬌鐢ㄨ繃搴﹀畯錛岃浣犵殑杈撳叆鎺ョ潃灞曞紑銆?br />瀵逛簬澶氭灞曞紑娌℃湁浠庢渶鏍規(guī)湰鐨勫師鐞嗚В閲婏紝鍙槸浠庡疄楠屾劅瀹樹笂瀵硅繖涓壒鎬у仛浜嗗垎鏋愶紝瀹為檯涓婏紝鑷繁涔熶笉浼氬啓鍑洪偅涔堝鏉傜殑瀹忥紙鎬曚腑闂磋皟鐢ㄥ嚭婕忔礊錛夈?br />
瀹忕殑鍩烘湰甯歌鐢ㄦ硶錛岄兘宸笉澶氭灇涓句簡涓鐣紝寰鍚庡湪瑙佸埌鏇撮珮綰х殑鐜╂硶鍜屾瘮杈冪簿楂撶殑鍐欐硶寰鍚庡啀鎱㈡參琛ュ厖涓婃潵鍚э紝鍙﹀GNU鐨勬墿灞曚篃浼氬湪鍚庣瘒緇х畫瀛︿範浜嗚В銆?/div>
]]>
閭d箞鍦ㄤ粈涔堝満鏅笅闇瑕佺敤鍒板畯鍛紵閬囧埌涓浜涢噸澶嶇殑涓滆タ錛岀畝鍗曠殑鏈?nbsp;for(i = 0; i < n; i ++) 涔嬬被鐨勶紝涓轟簡鍑忓皯綣佺悙鐨勭紪鐮侊紝鍙兘浣跨敤
2 #define MIN(A,B) A<B?A:B
3 int main()
4 {
5 int a =5, b =6;
6 printf("%d", MIN(a, b));
7 }
float b = MIN(a++, 1.5f);
printf("a=%f, b=%f",a,b);
int b = 1;
int c = 2;
b + c;
});
鍩轟簬榪欑鐗規(guī)э紝鎴戜滑鍙互鍦ㄥ畯閲岄潰涓烘瘡涓紶鍏ョ殑鍙傛暟榪涜涓涓嫹璐濓紝鐒跺悗鍐嶅鎷瘋礉鍚庣殑鍙傛暟榪涜瀹為檯鐨勬瘮杈冭繍綆楋紝閭d箞鏈緇堝疄鐜頒簡涓涓瘮杈冨畨鍏ㄧ殑鏈灝忓兼瘮杈冪殑瀹忓畾涔夛細
typeof(x) __min1 = (x); \
typeof(y) __min2 = (y); \
(void) (& __min1 == & __min2); \
__min1 < __min2 ? __min1 :min2})
]]>
]]>
#include <stdlib.h>
#include <string.h>
const int N = 55;
const double eps = 1e-7;
const int SIZE = N*N;
int n, m , k;
int L[SIZE], R[SIZE], U[SIZE], D[SIZE], Sum[SIZE], Row[SIZE], Col[SIZE];
int lenx, id, deep, anslen;
bool OK;
inline int rd() {
char ch;
while( ch = getchar(), ch == ' ' || ch == '\n');
int d = ch - '0';
while( ch = getchar(), ch <= '9' && ch >= '0' ) d = d* 10 + ch - '0';
return d;
}
struct point {
int x, y;
void read() {
x = rd(); y = rd();
}
} city[N], radar[N];
struct circle {
point o;
double r;
circle(){}
circle(point _o, double _r) {
o = _o;
r = _r;
}
bool incircle(point q) {
return 1.0*(o.x-q.x)*(o.x-q.x) + 1.0*(o.y-q.y)*(o.y-q.y) - r * r < eps;
}
} Radar[N];
void init() {
n = rd(); m = rd(); k = rd();
for(int i = 1; i <= n; i ++) city[i].read();
for(int i = 1; i <= m; i ++) Radar[i].o.read();
}
inline void pre(int cntcol) {
for(int i = 0; i <= cntcol; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = cntcol; R[cntcol] = 0;
id = cntcol + 1;
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j];
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
inline void remove(int &c) {
for(int i = D[c]; i != c ; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
inline void resume(int &c) {
for(int i = U[c]; i != c ; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
inline int Astar() {
int res = 0;
bool vis[N*N] = {false};
for(int i = R[0]; i != 0; i =R[i]) {
if( !vis[ i ] ) {
vis[ i ] = true;
res ++;
for(int j = D[i]; j != i; j = D[j]) {
for(int k = R[j]; k != j; k = R[k]) {
vis[ Col[k] ] = true;
}
}
}
}
return res;
}
void dfs(int dep) {
if( Astar() + dep > deep ) return ;
if(R[0] == 0) {
anslen = dep;
OK = true;
return;
}
int idx = R[0];
for(int i = R[0] ; i != 0 ; i = R[i]) {
if(Sum[i] < Sum[idx]) {
idx = i;
if( Sum[idx] <= 1 ) break;
}
}
for(int i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(int j = R[i] ; j != i ; j = R[j]) remove(j);
dfs( dep + 1 );
for(int j = L[i] ; j != i ; j = L[j]) resume(j);
resume(i);
if( OK ) return;
}
}
inline void build() {
int x[N];
for(int i = 1; i <= m; i ++) {
lenx = 0;
for(int j = 1; j <= n; j ++) {
if( Radar[i].incircle(city[j]) ) {
x[lenx++] = j;
}
}
insert(i, x);
}
}
bool check(double R) {
for(int i = 1; i <= m; i ++) Radar[i].r = R;
pre(n);
build();
deep = 0;
anslen = 0;
OK = false;
while( !OK ) {
if( deep > k ) break;
dfs(0);
deep ++;
}
return OK;
}
void solve() {
double left = 0, right = 1e29, mid;
while( right - left > eps) {
mid = (left + right) / 2;
if( check(mid) ) {
right = mid;
} else {
left = mid;
}
}
printf("%lf\n", left);
}
int main() {
int t;
scanf("%d", &t);
while( t -- ) {
init();
solve();
}
}
]]>
#include <string.h>
const int N = 16;
const int SIZE = N*N*N*N;
int L[SIZE], R[SIZE], U[SIZE], D[SIZE], Sum[SIZE], Row[SIZE], Col[SIZE];
int lenx, id, deep, anslen;
bool OK;
int n, m, n1, m1;
int ini[N][N];
inline int read() {
char ch;
while( ch = getchar(), ch == ' ' || ch == '\n');
int d = ch - '0';
while( ch = getchar(), ch <= '9' && ch >= '0' ) d = d* 10 + ch - '0';
return d;
}
void pre(int cntcol) {
for(int i = 0; i <= cntcol; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = cntcol; R[cntcol] = 0;
id = cntcol + 1;
}
void init() {
int cnt = 1;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
ini[i][j] = read();
if( ini[i][j] == 1 ) ini[i][j] = cnt ++;
}
}
n1 = read(); m1 = read();
pre(cnt-1);
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j];
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
void build() {
int r = 0;
int x[N*N];
for(int i = 0; i <= n - n1; i ++ ) {
for(int j = 0; j <= m - m1; j ++) {
r ++;
lenx = 0;
for(int p = 0; p < n1; p ++) {
for(int q = 0; q < m1; q ++ ) {
if( ini[i+p][j+q] > 0 ) {
x[lenx++] = ini[i+p][j+q];
}
}
}
insert(r, x);
}
}
}
void remove(int &c) {
for(int i = D[c]; i != c ; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void resume(int &c) {
for(int i = U[c]; i != c ; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
inline int Astar() {
int res = 0;
bool vis[N*N] = {false};
for(int i = R[0]; i != 0; i =R[i]) {
if( !vis[ i ] ) {
vis[ i ] = true;
res ++;
for(int j = D[i]; j != i; j = D[j]) {
for(int k = R[j]; k != j; k = R[k]) {
vis[ Col[k] ] = true;
}
}
}
}
return res;
}
void dfs(int dep) {
if( Astar() + dep > deep ) return ;
if(R[0] == 0) {
anslen = dep;
OK = true;
return;
}
int idx = R[0];
for(int i = R[0] ; i != 0 ; i = R[i]) {
if(Sum[i] < Sum[idx]) {
idx = i;
if( Sum[idx] <= 1 ) break;
}
}
for(int i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(int j = R[i] ; j != i ; j = R[j]) remove(j);
dfs( dep + 1 );
for(int j = L[i] ; j != i ; j = L[j]) resume(j);
resume(i);
if( OK ) return;
}
}
int main() {
while( scanf("%d %d", &n, &m) != EOF ) {
init();
build();
deep = 0;
anslen = 0;
OK = false;
while( !OK ) {
//deep ++;
dfs(0);
deep ++;
}
printf("%d\n", anslen);
}
//while(1);
return 0;
}
鍐欎簡涓彲浠ョ敤浣滄澘瀛愮殑DLX闈炵簿紜鐩?br>
]]>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
const int N = 16;
int L[N*N*N], R[N*N*N], U[N*N*N], D[N*N*N], Sum[N*N*N], Row[N*N*N], Col[N*N*N];
char inimap[N][N];
int map[N][N];
int n, m, cntrow, cntcol;
int lenx, id, deep, anslen;
bool OK;
int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool flag[50];
void init() {
for(int i = 0; i < n; i ++) {
scanf("%s", inimap[i]);
}
memset(map, 0, sizeof(map));
cntrow = 0;
cntcol = 0;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
if ( inimap[i][j] == '*') map[i][j] = -1;
if ( inimap[i][j] == '.') map[i][j] = 300 + (++cntrow);
if ( inimap[i][j] == '#') map[i][j] = (++cntcol);
}
}
// for(int i = 0; i < n; i ++) {
// for(int j = 0; j < m; j ++) {
// printf("%5d", map[i][j]);
// }puts("");
// }
}
void pre() {
for(int i = 0; i <= cntcol; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = cntcol; R[cntcol] = 0;
id = cntcol + 1;
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j];
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
inline int expend(int i, int j, int k) {
int t = 1;
while(true) {
int x = i + move[k][0] * t;
int y = j + move[k][1] * t;
if( x < 0 || x >= n || y < 0 || y >= m || map[x][y] == -1) return -1;
if( map[x][y] > 0 && map[x][y] < 300 ) return map[x][y];
t ++;
}
}
struct node {
int len;
int x[5];
bool operator < (const node a) const {
len > a.len;
}
};
void build() {
int x[5], r = 0;
node tp[15*15] ;
int cnt = 0;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
lenx = 0;
if( map[i][j] > 300 ) {
for(int k = 0; k < 4; k ++) {
int t = expend(i, j, k);
if( t == -1 ) continue;
x[lenx++] = t;
}
tp[cnt].len = lenx;
for(int k = 0; k < lenx; k ++) tp[cnt].x[k] = x[k];
cnt ++;
}
}
}
memset(flag, 0, sizeof( flag));
std::sort(tp, tp + cnt);
for(int i = 0; i < cnt; i ++) {
int j;
for(j = 0; j < tp[i].len; j ++) {
if( flag[tp[i].x[j]] ) break;
flag[tp[i].x[j]] = 1;
}
if( j == tp[i].len) {
lenx = tp[i].len;
insert(++r, tp[i].x);
}
}
}
void remove(int &c) {
for(int i = D[c]; i != c ; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void resume(int &c) {
for(int i = U[c]; i != c ; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
inline int Astar() {
int res = 0;
bool vis[16] = {false};
for(int i = R[0]; i != 0; i =R[i]) {
if( !vis[ i ] ) {
vis[ i ] = true;
res ++;
for(int j = D[i]; j != i; j = D[j]) {
for(int k = R[j]; k != j; k = R[k]) {
vis[ Col[k] ] = true;
}
}
}
}
return res;
}
void dfs(int dep) {
//printf("%d %d %d\n", Astar(), dep, deep) ;
//system("pause");
if( Astar() + dep > deep ) return ;
if(R[0] == 0) {
anslen = dep;
OK = true;
return;
}
int idx = R[0];
// printf("%d\n", idx);
for(int i = R[0] ; i != 0 ; i = R[i]) {
if(Sum[i] < Sum[idx]) {
idx = i;
//if( Sum[idx] <= 1 ) break;
}
}
for(int i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(int j = R[i] ; j != i ; j = R[j]) remove(j);
dfs( dep + 1 );
for(int j = L[i] ; j != i ; j = L[j]) resume(j);
resume(i);
if( OK ) return;
}
}
int main() {
while( scanf("%d %d", &n, &m) != EOF ) {
init();
pre();
build();
deep = 1;
OK = false;
anslen = 257;
while( !OK ) {
dfs(0);
deep ++;
}
printf("%d\n", anslen);
}
//while(1);
return 0;
}
]]>
#include <string.h>
#include <stdlib.h>
const int N = 60;
const int M = N * N;
int map[N][10];
int len[N];
int L[16*N*N], R[16*N*N], U[16*N*N], D[16*N*N], Sum[16*N*N], Row[16*N*N], Col[16*N*N];
int ans[16*N];
int id, anslen, r;
int H[16*N];
bool OK;
int n, m;
int lenx;
int deep;
void pre() {
for(int i = 0; i <= n; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = n; R[n] = 0;
id = n + 1;
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j];
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
//n*2^4 * n
//void build() {
// int x[6];
// r = 0;
// for(int i = 1; i <= n; i ++) {
// for(int j = 0; j < (1<<len[i]); j ++) {
// lenx = 0;
// r ++;
// x[lenx++] = i;
// for(int k = 0; k < len[i]; k ++) {
// if( ((1<<k) & j) )x[lenx++] = map[i][k];
// }
// //for(int i = 0; i < lenx; i ++) printf("%d ", x[i]); puts("");
// //system("pause");
// //H[r] = i;
// insert(r, x);
// }
// }
// //pr/intf("%d\n", r);
//}
// n * n
void build() {
int x[6];
for(int i = 1; i <= n; i ++) {
lenx = 0;
x[lenx++] = i;
for(int j = 0; j < len[i];j ++) {
x[lenx ++] = map[i][j];
}
insert(i, x);
}
}
void remove(int &c) {
for(int i = D[c]; i != c ; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void resume(int &c) {
for(int i = U[c]; i != c ; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
inline int Astar() {
int res = 0;
bool vis[60] = {false};
for(int i = R[0]; i != 0; i =R[i]) {
if( !vis[ i ] ) {
vis[ i ] = true;
res ++;
for(int j = D[i]; j != i; j = D[j]) {
for(int k = R[j]; k != j; k = R[k]) {
vis[ Col[k] ] = true;
}
}
}
}
return res;
}
void dfs(int dep) {
if( Astar() + dep > deep ) return ;
if(R[0] == 0) {
anslen = dep;
OK = true;
return;
}
int i,j,idx = R[0];
for(i = R[0] ; i != 0 ; i = R[i]) {
if(Sum[i] < Sum[idx]) {
idx = i;
if( Sum[idx] <= 1 ) break;
}
}
for(i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(j = R[i] ; j != i ; j = R[j]) remove(j);
dfs( dep + 1 );
for(j = L[i] ; j != i ; j = L[j]) resume(j);
resume(i);
if( OK ) return;
}
}
int main() {
freopen("in.txt","r",stdin);
while( scanf("%d %d", &n, &m) != EOF ) {
memset(len, 0, sizeof( len ));
for(int i = 0; i < m; i ++) {
int s, t;
scanf("%d %d", &s, &t);
map[s][len[s]++] = t;
map[t][len[t]++] = s;
}
pre();
build();
deep = 1;
OK = false;
anslen = n;
while( !OK ) {
dfs(0);
deep ++;
}
printf("%d\n", anslen);
}
while(1);
return 0;
}
n*n鐨勫緩妯?鐒跺悗鎵炬渶灝戠殑琛屾暟浣垮緱姣忎竴鍒楄嚦灝戞湁涓涓?1'
]]>
#include <ctime>
#include <stdlib.h>
#include <string.h>
const int SIZE = 16;
const int N = SIZE*SIZE*SIZE;
const int M = SIZE*SIZE*4;
const char LET = 'A';
char map[SIZE+1][SIZE+1];
int L[N*M+1], R[N*M+1], U[N*M+1], D[N*M+1], Sum[N*M+1];
int x[5], lenx;
int Row[N*M+1], Col[N*M+1];
int ans[N+1], anslen;
int id;
bool OK;
void pre() {
for(int i = 0; i <= M; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = M; R[M] = 0;
id = M + 1;
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j]+1;
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
void build() {
for(int i = 0; i < SIZE; i ++) {
for(int j = 0; j < SIZE; j ++) {
for(int k = 0; k < SIZE; k ++) {
int row = k+SIZE*j+SIZE*SIZE*i+1;
lenx = 0;
if( map[i][j] == '-' || map[i][j] == k + 'A' ) {
x[lenx++] = SIZE*i + k;
x[lenx++] = SIZE*SIZE + SIZE*j + k;
int temp = (i / 4) * 4 + j / 4;
x[lenx++] = 2*SIZE*SIZE + temp * SIZE + k;
x[lenx++] = 3*SIZE*SIZE + i*SIZE + j;
insert(row, x);
}
}
}
}
}
inline void remove(int c) {
R[L[c]] = R[c];
L[R[c]] = L[c];
for(int id = D[c]; id != c; id = D[id]) {
for(int i = R[id]; i != id; i = R[i] ) {
D[U[i]] = D[i];
U[D[i]] = U[i];
Sum[Col[i]] --;
}
}
}
inline void resume(int c) {
L[R[c]] = c;
R[L[c]] = c;
for(int id = D[c]; id != c; id = D[id]) {
for(int i = R[id]; i != id; i = R[i] ) {
U[D[i]] = i;
D[U[i]] = i;
Sum[Col[i]] ++;
}
}
}
bool dfs(int deep) {
if( R[0] == 0 ) return true;
int column = R[0];
for(int i = R[0]; i != 0; i = R[i]) {
if( Sum[i] < Sum[column] ) {
column = i;
if( Sum[column] < 2 ) break;
}
}
remove(column);
for(int id = D[column]; id != column; id = D[id]) {
ans[deep] = Row[id];
for(int i = R[id]; i != id; i = R[i]) remove(Col[i]);
if( dfs( deep + 1) ) return true;
for(int i = L[id]; i != id; i = L[i]) resume(Col[i]);
}
resume(column);
return false;
}
int main() {
freopen("in.txt","r",stdin);
while( scanf("%s", map[0]) != EOF ) {
for(int i = 1; i < SIZE; i ++) scanf("%s", map[i]);
pre();
build();
dfs(0);
for(int i = 0; i < 256; i ++) {
int r = (ans[i] - 1) / SIZE / SIZE % SIZE;
int c = (ans[i] - 1) / SIZE % SIZE;
int val = (ans[i] - 1) % SIZE;
map[r][c] = val + 'A';
}
for(int i = 0; i < SIZE; i ++){
for(int j = 0; j < SIZE; j ++) printf("%c",map[i][j]);
printf("\n");
}
printf("\n");
}
while(1);
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=3076
]]>
#include <string.h>
const int N = 1005*1005;
int L[N], R[N], U[N], D[N], C[N], Sum[N];
int Row[N], Col[N];
int ans[N], anslen;
int n, m, id;
bool OK;
void pre() {
for(int i = 0; i <= m; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = C[i] = i;
Sum[i] = 0;
}
L[0] = m; R[m] = 0;
id = m + 1;
}
void build() {
int num, x;
for(int i = 1; i <= n; i ++) {
scanf("%d", &num);
for(int j = 0; j < num; j ++, id ++) {
scanf("%d", &x);
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
}
inline void remove(int c) {
R[L[c]] = R[c];
L[R[c]] = L[c];
for(int id = D[c]; id != c; id = D[id]) {
for(int i = R[id]; i != id; i = R[i] ) {
D[U[i]] = D[i];
U[D[i]] = U[i];
Sum[Col[i]] --;
}
}
}
inline void resume(int c) {
L[R[c]] = c;
R[L[c]] = c;
for(int id = D[c]; id != c; id = D[id]) {
for(int i = R[id]; i != id; i = R[i] ) {
U[D[i]] = i;
D[U[i]] = i;
Sum[Col[i]] ++;
}
}
}
void dfs(int deep) {
if( R[0] == 0 ) {
OK = true;
anslen = deep;
return ;
}
int column = R[0];
for(int i = D[0]; i != 0; i = D[i]) {
if( Sum[i] <= Sum[column] ) column = i;
}
remove(column);
for(int id = D[column]; id != column; id = D[id]) {
ans[deep] = Row[id];
for(int i = R[id]; i != id; i = R[i]) remove(Col[i]);
dfs( deep + 1);
if(OK) return;
for(int i = R[id]; i != id; i = R[i]) resume(Col[i]);
}
resume(column);
}
int main() {
while( ~scanf("%d %d", &n, &m) ) {
pre();
build();
OK = false;
dfs(0);
if( OK ) {
printf("%d", anslen);
for(int i = 0; i < anslen; i ++) printf(" %d", ans[i]);
puts("");
} else {
puts("NO");
}
}
}
http://acm.hust.edu.cn/thanks/problem.php?id=1017
]]>
#define LOOP(a,b,c,d) for(a=b;a<c;a+=d)
#define L(a) LOOP(a,0,8,1)
#define ENEMY(a,b) ((a-'a')*(b-'a')<0&&a!='.'&&b!='.')
#define FRIEND(a,b) ((a-'a')*(b-'a')>0&&a!='.'&&b!='.')
int mdir[16][2]={0,1,-1,1,-1,0,-1,-1, 0,-1,1,-1,1,0,1,1,//鐩擱偦縐誨姩8涓柟鍚?nbsp;
-1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1,2,1,1,2};//椹縐誨姩8涓柟鍚?nbsp;
int md[5][4]={0,8,1,2, //king md[0]-md[1]:褰撳墠媯嬪瓙鐨勭Щ鍔ㄦ暟緇勭殑涓嬫爣鑼冨洿
0,8,1,8, //queen md[2] :縐誨姩鏁扮粍鐨勯夊彇闂撮殧錛?->鍏釜鏂瑰悜錛?nbsp;2->鍥涗釜鏂瑰悜錛?nbsp;
0,8,2,8, //rook md[3] :閬嶅巻褰撳墠媯嬪瓙涓嬈℃搷浣滃彲浠ユ敾鍑葷殑鑼冨洿闇瑕佽繘琛岀Щ鍔ㄧ殑嬈℃暟
1,8,2,8, //bishop
8,16,1,2 //knight
};
int KX,KY,KADD,KAT[8][2],KAL,MBLE,ATTACK[8][8],MOVE[8][8],ESC,BLE;
char map[8][10];
char BW[2]; // 褰撳墠閫夋墜
int trs(char c){
if(c<'a')c+='a'-'A';//澶у啓杞皬鍐?nbsp;
if(c=='k')return 0;
if(c=='q')return 1;
if(c=='r')return 2;
if(c=='b')return 3;
if(c=='n')return 4;
return -1;
/*
Rook 杞?nbsp;2
Bishop 璞?nbsp;3
Queen 鍚?nbsp;1
Knight 椹?nbsp;4
King 鐜?nbsp;0
*/
}
void InitMap(){
int i,j;
L(i)L(j)ATTACK[i][j]=MOVE[i][j]=0;MBLE=KADD=ESC=BLE=0;
scanf("%s",BW);
L(i)scanf("%s",map[i]);
L(i)L(j)if(trs(map[i][j])==0&&FRIEND(map[i][j],BW[0])){
KX=i;KY=j;i=j=8;
}
}
int StepMove(int x,int y,int d,int l,int *m,int *n){
*m=x+mdir[d][0]*l;*n=y+mdir[d][1]*l;
if(*m<0||*m>7||*n<0||*n>7)return -1;
if(map[*m][*n]=='.')return 0;
return 1;
}
void ATT(char c,int x,int y){
int d,l,r,s,m,n,i,sx,sy;
r=trs(c); //褰撳墠鏁屼漢鐨勭被鍨?nbsp;
LOOP(d,md[r][0],md[r][1],md[r][2]){
LOOP(l,1,md[r][3],1){
s=StepMove(x,y,d,l,&m,&n);
if(s>=0)ATTACK[m][n]++;
if(s)break; //閬囧埌涓涓潪絀虹殑浣嶇疆鎴栬呭嚭鐣屽氨鍋滄
}
if(s<=0||FRIEND(map[m][n],c))continue;//褰撳墠媯嬪瓙鏈ㄦ湁閬囧埌鍏朵粬媯嬪瓙鎴栬呴亣鍒扮殑媯嬪瓙鏄弸鏂瑰崟浣?nbsp;
if(KX==m&&KY==n){ //濡傛灉鏄亣鍒頒簡鎴戞柟鐨勭帇
KADD++;KAL=l; //鎴戞柟鐜嬭鏀誨嚮嬈℃暟+1
if(KADD==1) //濡傛灉闂柟鐜嬪彧鏄鏀誨嚮涓嬈?nbsp;
LOOP(i,0,KAL,1){ //璁板綍鏀誨嚮鐜嬬殑榪欐潯綰胯礬 KAT
KAT[i][0]=x+i*mdir[d][0];
KAT[i][1]=y+i*mdir[d][0];
}
continue;
}
if(r==0||r==4)continue; //濡傛灉鐜嬪拰椹蛋鍒?m,n)閭d箞縐誨紑鑷繁鍦?m,n)涓婄殑媯嬪瓙涓嶄細瀵圭帇閫犳垚濞佽儊
LOOP(i,1,8,1) //鍋囪縐誨紑鍦?m,n)鐨勬湰鏂規(guī)瀛愪嬌寰楃帇琚敾鍑誨垯鏍囪璇ヤ綅緗負涓嶅彲鍔?-1)
if(s=StepMove(m,n,d,i,&sx,&sy))break;
if(KX==sx&&KY==sy)MOVE[m][n]=-1;
}
}
void BLOCK(char c,int x,int y){
int d,l,r,s,m,n;
r=trs(c);if(r==0)return;//鏋氫婦涓嶆槸鐜嬩笖鑳界Щ鍔ㄧ殑鐨勫弸鏂瑰崟浣?nbsp;
LOOP(d,md[r][0],md[r][1],md[r][2]){
LOOP(l,1,md[r][3],1){
s=StepMove(x,y,d,l,&m,&n);
if(s)break;
else {MOVE[m][n]++;MBLE++;}
}
if(s==1&&ENEMY(map[m][n],c)){
MBLE++;MOVE[m][n]++;
}
}
}
int main(){
int i,j,t,x,y;
scanf("%d",&t);
while(t--){
InitMap();//璇誨叆鍥?nbsp;浠ュ強鍒濆鍖栧悇涓暟緇?nbsp;
L(i)L(j)if(ENEMY(map[i][j],BW[0]))ATT(map[i][j],i,j);
/*
鍋氫簡涓ゅ紶琛ˋTT鍜孧OVE
ATT琛ㄧず鏁屾柟鑳芥敾鍑葷殑鎵鏈夌偣
MOVE[x][y] = -1 琛ㄧず鏈柟鍦?x,y)澶勭殑媯嬪瓙鏃犳硶縐誨姩
KADD璁板綍鐜嬭澶氬皯涓晫鏂瑰崟浣嶆敾鍑誨埌
*/
L(i)L(j)if(FRIEND(map[i][j],BW[0])&&MOVE[i][j]!=-1)BLOCK(map[i][j],i,j);
L(i){
x=KX+mdir[i][0];y=KY+mdir[i][1];if(x<0||x>7||y<0||y>7)continue;
if(ATTACK[x][y]==0&&(map[x][y]=='.'||ENEMY(map[x][y],BW[0]))){ESC++;break;}
}//濡傛灉鐜嬭蛋涓姝ュ彲浠ョЩ鍔ㄤ笖涓嶅彈鏀誨嚮鍒橢SC++
if(KADD==1)LOOP(i,0,KAL,1)if(MOVE[KAT[i][0]][KAT[i][1]]){BLE=1;break;}
printf("%s IS ",BW[0]=='B'?"BLACK":"WHITE");
if(KADD==0&&(ESC||MBLE))printf("SAFE\n");
else if(KADD&&(ESC||BLE))printf("CHECKED\n");
else printf("CHECKMATED\n");
}
return 0;
}
棰樻剰鏄粰瀹氫竴涓鐩樺拰璋佺幇鍦ㄥ嚭鎵嬶紝闂粬鏄惁瀹夊叏鎴栬呰灝嗘鎴栬呰灝嗗啗
]]>