蓝桥杯 方格填数

来源:互联网 发布:win10菜单网络键打不开 编辑:程序博客网 时间:2024/04/30 09:06
  方格填数
#include <stdio.h>#include <math.h>int flag[3][4];//表示哪些可以填数int mpt[3][4]; //填数bool visit[10];int ans = 0;void init()//初始化{int i,j;for(i = 0 ; i < 3 ; i ++)for(j = 0 ; j < 4 ; j ++)flag[i][j] = 1;flag[0][0] = 0;flag[2][3] = 0;}void Solve(){int dir[8][2] = { 0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};int book = true;for(int i = 0 ; i < 3 ; i ++){for(int j = 0 ; j < 4; j ++){//判断每个数周围是否满足if(flag[i][j] == 0)continue;//如果是0值,不是需要判断的位置  for( int k = 0 ; k < 8 ; k ++){int x,y;x = i + dir[k][0];//八个方向 y = j + dir[k][1];if(x < 0 || x >= 3 || y < 0 || y >= 4 || flag[x][y] == 0) continue;//超出界限 if(fabs(mpt[x][y] - mpt[i][j]) == 1) book = false;//相邻 }}}//如果不存在相邻的情况 if(book) ans ++;//相当于放置之后再判断  }void dfs(int index){int x,y;x = index / 4;y = index % 4;if( x == 3)//index已经超过 现有的个数  即所有的格子都已经放置完毕    {Solve();        return;}   if(flag[x][y])   {for(int i = 0 ; i < 10 ; i ++)           {if(!visit[i])//看1-10的数字有没有被取走了                     {visit[i] = true;                        mpt[x][y] = i;                         dfs(index+1);                           visit[i] = false;                   }                                }   }  else//不断放置    {   dfs(index+1);    }}int main(){init();dfs(0);printf("%d\n",ans);return 0;}

                                             
0 0
原创粉丝点击