zoukankan      html  css  js  c++  java
  • P1074 靶形数独

    P1074 靶形数独
    正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #include<map>
      9 #include<stack>
     10 #include<cstring>
     11 #define inf 2147483647
     12 #define For(i,a,b) for(register int i=a;i<=b;i++)
     13 #define p(a) putchar(a)
     14 #define g() getchar()
     15 //by war
     16 //2017.11.7
     17 using namespace std;
     18 bool xuse[10][10],yuse[10][10];
     19 int a[10][10];
     20 int ans,n=8;
     21 int tot;
     22 void in(int &x)
     23 {
     24     char c=g();x=0;
     25     while(c<'0'||c>'9')c=g();
     26     while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
     27 }
     28 void o(int x)
     29 {
     30     if(x>9)o(x/10);
     31     p(x%10+'0');
     32 }
     33 
     34 inline bool test(register int step,register int num)
     35 {
     36     register int x=(step/9)/3*3;
     37     register int y=(step%9)/3*3;
     38     For(i,0,2)
     39       For(j,0,2)
     40         if(a[x+i][y+j]==num)
     41         return false;
     42         return true;
     43 }
     44 
     45 inline int get()
     46 {
     47     int cnt=0;
     48     int t=5;
     49     For(len,0,4)
     50     {
     51         t++;
     52         For(j,len,n-len)
     53         cnt+=a[len][j]*t;
     54         if(len==4)
     55         break;
     56         For(j,len,n-len)
     57         cnt+=a[n-len][j]*t;
     58         
     59         For(i,len+1,n-len-1)
     60         cnt+=a[i][len]*t;
     61         
     62         For(i,len+1,n-len-1)
     63         cnt+=a[i][n-len]*t;
     64     }
     65     return cnt;
     66 }
     67 
     68 inline void dfs(register int step)
     69 {
     70     if(step==81)
     71     {
     72     ans=max(get(),ans);
     73     tot++;
     74     return;
     75     }
     76     if(a[step/9][step%9]!=0)
     77     dfs(step+1);
     78     else 
     79     for(register int i=9;i>=1;i--)
     80     {
     81         if(!xuse[step/9][i]&&!yuse[step%9][i]&&test(step,i))
     82         {
     83             a[step/9][step%9]=i;
     84             xuse[step/9][i]=true;
     85             yuse[step%9][i]=true;
     86             dfs(step+1);
     87             a[step/9][step%9]=0;
     88             xuse[step/9][i]=false;
     89             yuse[step%9][i]=false;
     90         }
     91     }
     92 }
     93 
     94 int main()
     95 {
     96     for(register int i=8;i>=0;i--)
     97       For(j,0,8)
     98         {
     99             in(a[i][j]);
    100             if(a[i][j]!=0)
    101             {
    102                 xuse[i][a[i][j]]=true; 
    103                 yuse[j][a[i][j]]=true;
    104             }
    105         }
    106     dfs(0);
    107     if(ans!=0)
    108     o(ans);
    109     else
    110     puts("-1");
    111      return 0;
    112 }
  • 相关阅读:
    递推最小二乘辨识平面双机械臂Matlab代码
    Matlab Robitic Toolbox学习笔记Day2
    DSP28335与CH340使用心得
    DSP 28335 GPIO输入引脚信号跳变
    DSP 28335 RS485 SCI串口通讯 出错无法进入中断
    DSP 28335 烧写FLASH程序 可以在线仿真 无法离线运行
    CRC16-Modbus 校验 C语言
    C语言 负数转十六进制 电机转速 CANopen命令转换
    CAN转USB 调试助手使用说明
    串的模式匹配 BF算法&KMP算法
  • 原文地址:https://www.cnblogs.com/war1111/p/7799685.html
Copyright © 2011-2022 走看看