下五子棋
这个代码量
爱了吗
有没有大佬可以发一下每一题的思路,呜呜呜
#include<iostream>
using namespace std;
int g[15][15];
int dr[8]={0,0,1,-1,1,-1,1,-1};//横竖左右
int dc[8]={-1,1,0,0,1,-1,-1,1};
int flag1;
int flag2=1;
int vic;
int vis[15][15];
int fr,fc;
void dfs1(int a,int b)
{
int rr=a,cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[0];
cc+=dc[0];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
// cout<<flag1<<"&&"<<flag2<<"__"<<g[rr][cc]<<endl;
}
// cout<<"-----"<<endl;
rr=a;cc=b;//更新起点
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[1];
cc+=dc[1];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
// cout<<flag1<<"&&"<<flag2<<"__"<<g[rr][cc]<<endl;
}
}
void dfs2( int a,int b)
{
int rr=a,cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[2];
cc+=dc[2];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
rr=a;cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[3];
cc+=dc[3];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
}
void dfs3(int a,int b)
{
int rr=a,cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[4];
cc+=dc[4];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
rr=a;cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[5];
cc+=dc[5];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
}
void dfs4(int a,int b)
{
int rr=a,cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[6];
cc+=dc[6];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
rr=a;cc=b;
while(1){
if(flag2==4&&flag1==1){
vic=1;
return;
}
rr+=dr[7];
cc+=dc[7];
if(rr<1||rr>12||cc<1||cc>12)
break;
if(g[rr][cc]==0){
flag1++;
if(flag1==2){
//不能继续搜下去了
flag1--;
break;
}
else if(flag1==1){
fr=a;
fc=b;//记录下第一次遇见零的位置
}
}
else if((g[rr][cc]==g[a][b])||g[rr][cc]==g[fr][fc]){
flag2++;
}
else{
break;
}
}
}
int main()
{
for(int i=1;i<=12;++i){
for(int j=1;j<=12;++j){
cin>>g[i][j];
}
}
for(int i=1;i<=12;++i){
for(int j=1;j<=12;++j){
//标记数组
if(g[i][j]==0)//不考虑0起点
continue;
flag1=0;flag2=1;fr=0;fc=0;
dfs1(i,j);
// cout<<vic<<endl;
flag1=0;flag2=1;fr=0;fc=0;
dfs2(i,j);
// cout<<vic<<endl;
flag1=0;flag2=1;fr=0;fc=0;
dfs3(i,j);
// cout<<vic<<endl;
flag1=0;flag2=1;fr=0;fc=0;
dfs4(i,j);
// cout<<vic<<endl;
if(vic==1)
{
cout<<"YES";
// cout<<i<<"*"<<j<<endl;
return 0;
}
}
}
cout<<"NO";
}