- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40348
- 在线时间
- 小时
|
发表于 2009-10-16 16:20:53
|
显示全部楼层
N*N的格子,
N=1,2,4先手败
N=3,5先手胜-
- #include <string.h>
- #include <assert.h>
- #include <stdlib.h>
- #include <vector>
- using namespace std;
- #define N 4
- #define BITS (N*N)
- typedef unsigned int SET;
- #define BIT(x,y) ((x)+(y)*N)
- char result[1<<BITS];
- vector<SET> lines;
- void init_lines()
- {
- int i;
- for(i=0;i<BITS;i++){///single element
- SET s=1<<i;
- lines.push_back(s);
- }
- for(i=0;i<N;i++){
- int x=i,y=0;
- SET s=1<<BIT(x,y);
- while(++y<N){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- for(i=0;i<N;i++){
- int x=0,y=i;
- SET s=1<<BIT(x,y);
- while(++x<N){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- for(i=0;i<N;i++){
- int x=i,y=0;
- SET s=1<<BIT(x,y);
- while(--x>=0&&++y<N){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- for(i=0;i<N;i++){
- int x=i,y=0;
- SET s=1<<BIT(x,y);
- while(++x<N&&++y<N){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- for(i=1;i<N-1;i++){
- int x=i,y=N-1;
- SET s=1<<BIT(x,y);
- while(--x>=0&&--y>=0){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- for(i=1;i<N-1;i++){
- int x=i,y=N-1;
- SET s=1<<BIT(x,y);
- while(++x<N&&--y>=0){
- s|=1<<BIT(x,y);
- lines.push_back(s);
- }
- }
- }
- #define FAIL (char)-1
- #define SUCC (char)1
- char search(SET s)
- {
- int i;
- if(result[s]!=0)
- return result[s];
- for(i=0;i<lines.size();i++){
- if((s&lines[i])==lines[i]){
- char r=search(s&~lines[i]);
- if(r==FAIL)
- break;
- }
- }
- if(i==lines.size()){
- result[s]=FAIL;
- }else{
- result[s]=SUCC;
- }
- return result[s];
- }
-
- int main()
- {
- init_lines();
- result[0]=SUCC;
- int i;
- for(i=0;i<BITS;i++){
- result[1<<i]=FAIL;
- }
- char r=search((1<<BITS)-1);
- if(r==SUCC){
- printf("First win\n");
- }else{
- printf("First fail\n");
- }
- }
复制代码 |
|